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