跨域認證的問題
互聯網服務離不開用戶認證.一般流程如下:
1、用戶向服務器發送用戶名和密碼。
2、服務器驗證通過后,在當前對話(session)里面保存相關數據,比如用戶角色、登錄時間等等。
3、服務器向用戶返回一個 session_id,寫入用戶的 Cookie。
4、用戶隨后的每一次請求,都會通過 Cookie,將 session_id 傳回服務器。
5、服務器收到 session_id,找到前期保存的數據,由此得知用戶的身份。
自己創建 Session
- 注: session 是后端的內容
- 具體思路如下:
- 使用 session 空對象存 cookie 鍵值對.
- 當第一次進入的時候,生成一個隨機數 sid,通過 cookie 傳遞 sid,并再后端使用
session[sid] = msg
的方式,記錄本次的值 - 若非第一次進入,則需要從 cookie 中解析出 sid,進而得到該 sid 下的內容(有可能是用戶信息)
const session = {}
http.createServer((req, res) => {const sessionKey = 'sid'if (req.url === '/favicon.ico') {return} else {const cookie = req.headers.cookieif (cookie && cookie.indexOf(sessionKey) > -1) {res.end('Come Back')console.log('cookie:', cookie)// 簡略寫法(未必具有通用性)const pattern = new RegExp(`${sessionKey}=([^;]+);?\S*`)const sid = pattern.exec(cookie)[1]console.log('session:', sid, session, session[sid])} else {const sid = (Math.random() * 9999999).toFixed()res.setHeader('Set-Cookie', `${sessionKey} = ${sid}`)session[sid] = { name: 'laowang' }res.end('hello cookie')}}}).listen(3000)
- 說明:
- 瀏覽器首次訪問,會生成sid保存在服務器中,并將sid返回給瀏覽器;
- 瀏覽器遇到
Set-Cookie
: 后把后面的內容放到,cookie中; - 再次訪問相同網址時,瀏覽器會把cookie獲取,傳遞給服務器;
- 服務器根據sid進行認證,返回對應的結果
koa實現session
- 基本用法
const koa = require("koa");
const app = new koa();const session = require("koa-session");app.keys = ['marron'];const SESSION_CONFIG ={key: 'marron rain',maxAge: 86400000,httpOnly: true,signed: true
}app.use(session(SESSION_CONFIG, app));app.use(ctx =>{if(ctx.path === '/favicon.ico') return;let n = ctx.session.coung || 0;ctx.cession.count = ++n;ctx.body = `第${n}次訪問`;
});
app.listen(3000);
- 說明:
signed:true
: 對生成的Value進行hash算法,(把不定長的值)摘要出一個定長的字符串,并且具有血崩效應.- 摘要: 明文可以得出密文, 但是密文不能反編譯成明文. 且密文依賴于明文, 明文一改變, 密文發生翻天覆地的變化.這樣可以防篡改.
- 血崩效應: 明文發生很小的變化,密文變化很大,這樣很難破譯加密的規則.
- 常見的hash: SHA、MD5