【node】---token的原理及使用---【alley】

1、登錄的驗證流程web

  當用戶請求登陸的時候,若是沒有問題,咱們在服務端生成一條記錄,這個記錄裏能夠說明一下登陸的用戶是誰,而後把這條記錄的 ID 號發送給客戶端,客戶端收到之後把這個 ID 號存儲在 Cookie 裏,下次這個用戶再向服務端發送請求的時候,能夠帶着這個 Cookie ,這樣服務端會驗證一個這個 Cookie 裏的信息,看看能不能在服務端這裏找到對應的記錄,若是能夠,說明用戶已經經過了身份驗證,就把用戶請求的數據返回給客戶端算法

 

 

2、基於token的身份驗證方法express

 

  一、用戶向服務器發送用戶名和密碼。json

 

    二、服務端收到請求,去驗證用戶名與密碼服務器

 

  三、驗證成功後,服務端會簽發一個 Token,再把這個 Token 發送給客戶端。cookie

 

  四、客戶端收到 Token 之後能夠把它存儲起來,好比放在 Cookie 裏或者 Local Storage 裏ui

 

  五、用戶隨後的每一次請求,都會經過 Cookie,將 token 傳回服務器。加密

 

  六、服務端收到請求,而後去驗證客戶端請求裏面帶着的 Token,若是驗證成功,就向客戶端返回請求的數據spa

 

3、jsonwebtokencode

   一、jwt的原理

     服務器認證後,生成一個json對象,發送給用戶,就向下面這樣

 

{
  "姓名": "alley",
  "角色": "管理員",
  "到期時間": "2019年3月9日0點0分"
}

  

  二、jwt的組成部分

   header:頭部    payload:負載    secret:簽名

   

 

   2-一、header:

   header是一個json對象,主要由2部分組成,一個是token的類型,一個是使用的算法

{
    type:"jwt",
    alg:"HS256"
}

 

  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-三、secret:

  secret是一個簽名,防止數據篡改。這個簽名只有服務器知道,不能泄露給用戶。而後使用

  header中的簽名算法生成簽名。(算法默認是HMAC SHA256)

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

  

  

4、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 
}
相關文章
相關標籤/搜索