Token的原理及使用

一、登陸的驗證流程

當用戶請求登錄的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄里可以說明一下登錄的用戶是誰,然后把這條記錄的 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:簽名

image.png

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默認是不加密的,任何人都可以讀到,所以不要把私密信息放入這個部分

四、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 
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。