一、登陸的驗證流程
當用戶請求登錄的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄里可以說明一下登錄的用戶是誰,然后把這條記錄的 ID 號發送給客戶端,客戶端收到以后把這個 ID 號存儲在 Cookie 里,下次這個用戶再向服務端發送請求的時候,可以帶着這個 Cookie ,這樣服務端會驗證一個這個 Cookie 里的信息,看看能不能在服務端這里找到對應的記錄,如果可以,說明用戶已經通過了身份驗證,就把用戶請求的數據返回給客戶端
二、基於token的身份驗證方法
1、用戶向服務器發送用戶名和密碼。
2、服務端收到請求,去驗證用戶名與密碼
3、驗證成功后,服務端會簽發一個 Token,再把這個 Token 發送給客戶端。
4、客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里
5、用戶隨后的每一次請求,都會通過 Cookie,將 token 傳回服務器。
6、服務端收到請求,然后去驗證客戶端請求里面帶着的 Token,如果驗證成功,就向客戶端返回請求的數據
三、jsonwebtoken
1、jwt的原理
服務器認證后,生成一個json對象,發送給用戶,就向下面這樣
{ "姓名": "alley", "角色": "管理員", "到期時間": "2019年3月9日0點0分" }
2、jwt的組成部分
header:頭部 payload:負載 secret:簽名
2-1、header:
header是一個json對象,主要由2部分組成,一個是token的類型,一個是使用的算法
{ type:"jwt", alg:"HS256" }
2-2、payload:
payload也是一個json對象,用來存放實際需要傳遞的數據,官方規定了7個字段
iss (issuer):簽發人
exp (expiration time):過期時間
sub (subject):主題
aud (audience):受眾
nbf (Not Before):生效時間
iat (Issued At):簽發時間
jti (JWT ID):編號
除了官方定義的7個字段外,你還可以定義其他私有字段
{ iss:"admin", user:'alley', }
注意:JWT默認是不加密的,任何人都可以讀到,所以不要把私密信息放入這個部分
2-3、secret:
secret是一個簽名,防止數據篡改。這個簽名只有服務器知道,不能泄露給用戶。然后使用
header中的簽名算法生成簽名。(算法默認是HMAC SHA256)
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
四、jwt的基本使用(基於express)
const jwt = require("jsonwebtoken"); const secret = "secret";//簽名 const getCookie = (key)=>{ const cookies = req.headers.cookie; const arr = cookies.split("; "); for(var i=0;i<arr.length;i++){ let newArr = arr[i].split("="); if(newArr[0] == key){ return newArr[1]; } } } //驗證token const verifyTokenMiddle = (req,res,next)=>{ let token = getCookie("token"); jwt.verify(token, scret, function(err, decoded) { if(err){ return res.json({ state:false, info:"token驗證失敗" }) } next() }); } //創建token const createToken = (username)=>{ const payload = { user:username } return jwt.sign(payload, secret,{expiresIn:'1h'}); } module.exports = { createToken, verifyTokenMiddle }