一墨吓、登陸的驗證流程
當(dāng)用戶請求登錄的時候,如果沒有問題填渠,我們在服務(wù)端生成一條記錄,這個記錄里可以說明一下登錄的用戶是誰,然后把這條記錄的 ID 號發(fā)送給客戶端氛什,客戶端收到以后把這個 ID 號存儲在 Cookie 里莺葫,下次這個用戶再向服務(wù)端發(fā)送請求的時候,可以帶著這個 Cookie 枪眉,這樣服務(wù)端會驗證一個這個 Cookie 里的信息徙融,看看能不能在服務(wù)端這里找到對應(yīng)的記錄,如果可以瑰谜,說明用戶已經(jīng)通過了身份驗證,就把用戶請求的數(shù)據(jù)返回給客戶端
二树绩、基于token的身份驗證方法
- 用戶向服務(wù)器發(fā)送用戶名和密碼萨脑。
- 服務(wù)端收到請求,去驗證用戶名與密碼
- 驗證成功后饺饭,服務(wù)端會簽發(fā)一個 Token渤早,再把這個 Token 發(fā)送給客戶端。
- 客戶端收到 Token 以后可以把它存儲起來瘫俊,比如放在 Cookie 里或者 Local Storage 里
- 用戶隨后的每一次請求鹊杖,都會通過 Cookie,將 token 傳回服務(wù)器扛芽。
- 服務(wù)端收到請求骂蓖,然后去驗證客戶端請求里面帶著的 Token,如果驗證成功川尖,就向客戶端返回請求的數(shù)據(jù)
三登下、jsonwebtoken
1、jwt的原理
- 服務(wù)器認(rèn)證后叮喳,生成一個json對象被芳,發(fā)送給用戶,就向下面這樣
{
"姓名": "alley",
"角色": "管理員",
"到期時間": "2019年3月9日0點0分"
}
2、jwt的組成部分
header:頭部 payload:負(fù)載 secret:簽名
image.png
header : header是一個json對象馍悟,主要由2部分組成畔濒,一個是token的類型,一個是使用的算法
{
type:"jwt",
alg:"HS256"
}
payload:payload也是一個json對象锣咒,用來存放實際需要傳遞的數(shù)據(jù)侵状,官方規(guī)定了7個字段
{
iss (issuer):簽發(fā)人
exp (expiration time):過期時間
sub (subject):主題
aud (audience):受眾
nbf (Not Before):生效時間
iat (Issued At):簽發(fā)時間
jti (JWT ID):編號
}
除了官方定義的7個字段外,你還可以定義其他私有字段
{
iss:"admin",
user:'alley',
}
# 注意:JWT默認(rèn)是不加密的毅整,任何人都可以讀到壹将,所以不要把私密信息放入這個部分
四、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()
});
}
//創(chuàng)建token
const createToken = (username)=>{
const payload = {
user:username
}
return jwt.sign(payload, secret,{expiresIn:'1h'});
}
module.exports = {
createToken,
verifyTokenMiddle
}