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);
原文地址:https://www.cnblogs.com/baota/p/12827287.html