token的原理和使用
token就是用來進行身份驗證的
一:登錄的驗證流程
- 當用戶請求登錄的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄裏可以說明一下登錄的用戶是誰,然後把這條記錄的ID號發送給客戶端,客戶端收到以後把這個ID號存儲在Cookie裏,下次這個用戶再向服務端發送請求的時候,可以帶着這個Cookie,這樣服務端會驗證一下這個Cookie裏的信息,看看能不能在服務端這裏找到對應的記錄,如果可以,說明用戶已經通過了身份驗證,就把用戶請求的數據返回給客戶端。
二:基於token的身份驗證方法
- 用戶向服務器發送用戶名和密碼。
- 服務端收到請求,去驗證用戶名與密碼。
- 驗證成功後,服務端會簽發一個Token,再把這個Token發送給客戶端。
- 客戶端收到Token以後可以把它存儲起來,比如放在Cookie裏或者Local Storage裏。
- 用戶隨後的每一次請求,都會通過Cookie,將token傳回服務器。
- 服務端收到請求,然後去驗證客戶端請求裏面帶着的Token,如果驗證成功,就向客戶端返回請求的數據。
三:jsonwebtoken
-
jwt的原理
-
服務器認證後,生成一個json對象,發送給用戶
-
{ "姓名":"alley", "角色":"管理員", "到期時間":"2019年3月9日0點0分" }
-
-
-
jwt的組成部分
-
header:頭部
-
header是一個json對象,主要由2部分組成,一個是token的類型,一個是使用的算法
-
{ type:"jwt", alg:"HS256" }
-
-
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默認是不加密的,任何人都可以讀到,所以不要吧私密信息放入這個部分
-
-
secret:簽名
-
secret是一個簽名,防止數據篡改。這個簽名只有服務器知道,不能泄露給用戶。然後使用header中的簽名算法生成簽名(算法默認是HMACSHA256)
-
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]; } } } //驗證 const verifyTokenMiddle=(req,res,next)=>{ let token=getCookie("token"); jwt.verify(token,secret,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 }
-