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);