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);
  • 相关阅读:
    Kubernetes 部署 Kafka & Zookeeper & Kafka Manager
    prometheus-operator监控traefik-Ingress组件状态
    k8s与dns--coredns的一些实战经验
    kubernetes Tekton-CI/CD 持续集成流水线
    jenkins pipeline语法
    (Go)16.Redis连接池的使用
    (Go)15.golang printf 格式化输出
    (Go)14. 如何读取YAML,JSON,INI等配置文件
    Dubbo引用Javassist外部框架
    Dubbo之Filter 原理
  • 原文地址:https://www.cnblogs.com/baota/p/12827287.html
Copyright © 2011-2022 走看看