Bearer Token && JWT --- 深入理解令牌機制


Bear Token規范: 6750

  • 概念:描述在HTTP訪問OAuth2保護資源時如何使用令牌的規范
  • 特點:令牌就是身份證明
  • 具體規定:在請求頭中定義Authorization
1 Authorization:  Bearer <token>

// 在請求頭中添加 Authorization
import axios from "axios"

export default function(vm){
    // 設置請求攔截器
    axios.interceptors.request.use(config => {
        //獲取token  在發送請求之前做些什么
        const token = localStorage.getItem('token');
        if(token){
            // Bearer Token 規范
            config.headers.Authorization =  'Bearer ' + token;
        }
        return config;
    })

    // 設置響應攔截器  - 統一處理401狀態碼,清理token,跳轉login
    // 需要用到 app 實例
    axios.interceptors.response.use(null, error =>{
        // 請求失敗攔截器
        // 美喲u登陸或令牌過期
        if(error.response.status == "401"){
            // 清空vuex和localStorage
            vm.$store.dispatch('logout');
            vm.$router.push('/login');
        }
        // 
        return Promise.reject(error);

    })

}

 

 

Json Web Token規范  jwt.io

  • 概念:令牌的具體定義方式
  • 規定:令牌由三部分構成 -頭。載荷。簽名
  • 頭:包含加密算法 令牌類型等信息
  • 載荷:包含用戶信息 簽發時間和過期時間等信息
  • 簽名:根據頭 載荷及密鑰加密得到的哈希串  默認HS256 (Hmac Sha1 256)

  (明文,頭和載荷base64可以解碼,不可以放敏感信息,token防篡改)

 1 // koa | koa-router | jsonwebtoken | koa-jwt 
 2 const Koa = require('koa');
 3 const Router = require('koa-router');
 4 const jwt = require('jsonwebtoken');
 5 const jwtAuth = require('koa-jwt');
 6 
 7 const secret = 'it is a secret';  // 密鑰算法
 8 
 9 const app = new Koa();
10 const router = new Router();
11 
12 const { log } = console;
13 
14 router.get('/a',function(ctx){
15     ctx.body = {a:1}
16 })
17 
18 router.get('/api/login', async ctx => {
19     const { username, password } = ctx.query;
20     log(username, password);
21 
22     if (username == 'kaikeba' && password == '123') {
23         // 生成令牌
24         const token = jwt.sign(
25             {
26                 data: { name: 'kaikeba' }, // 用戶信息
27                 exp: Math.floor(Date.now() / 1000) + 60 * 60  // 過期時間,單位秒
28             },
29             secret
30         );
31         ctx.body = { code:1,token};
32     }else{
33         ctx.status = 401;
34         ctx.body = { code:0, message:'用戶名或密碼錯誤'}
35     }
36 });
37 
38 router.get(
39     '/api/userinfo',
40     jwtAuth({ secret }),
41     async ctx => {
42         ctx.body = { code:1, data:{name:'jerry',age:20}};
43     }
44 );
45 app.use(router.routes());
46 app.use(router.allowedMethods()); // 設置請求頭
47 app.listen(3000);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM