zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    SQL联结(Join)的命令详解
    Symbian c++在程序安装时显示一份免责声明
    Effective C++条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
    <转>S60系统出错问题汇总
    开发规范C#程序
    Javascript 进行decode编码,C#中进行解码的问题
    IIS7.5 不能访问3.5 wcf 的解决办法
    开发规范总结数据库
    [转载]Linux性能测试 tcpdump命令
    [转载]Linux性能测试 top命令
  • 原文地址:https://www.cnblogs.com/baota/p/12827287.html
Copyright © 2011-2022 走看看