token的原理和使用

token的原理和使用

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:頭部

      • 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
      }
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章