之前本人一直使用的鑒權(quán)方式是 服務(wù)端 redis存儲session進行驗證筒严。
本次采用jwt的方式 (JSON Web Token)
session驗證步驟:
1. 用戶輸入其登錄信息
2. 服務(wù)器驗證信息是否正確尊蚁,并創(chuàng)建一個session翰灾,然后將其存儲在內(nèi)存數(shù)據(jù)庫redis中
3. 服務(wù)器為用戶生成一個sessionId术奖,將具有sesssionId的Cookie將放置在用戶瀏覽器中
4. 在后續(xù)請求中鹰晨,會根據(jù)數(shù)據(jù)庫驗證sessionID孵睬,如果有效标捺,則接受請求
5. 一旦用戶注銷應(yīng)用程序炫欺,會話將在客戶端和服務(wù)器端都被銷毀
本次基于vue(前端) 和 node(后端乎完,使用egg框架)
進行jwt
的驗證學習
服務(wù)端
放在egg.js的servicer層 便于調(diào)用(也可以放在中間件處理)
'use strict';
const Service = require('egg').Service;
// 安裝的jwt插件
const jwt = require('jsonwebtoken');
// 自己設(shè)置的 key
const secert_key = '#modmfog$%ls12m1fspoweXh';
class TokenService extends Service {
// 生成jwt的方法
async signJwt(_id) {
return jwt.sign({
data: {
_id,
},
exp: Math.floor(Date.now() / 1000) + (60 * 60 * 3600 * 24 * 7),
}, secert_key);
}
// 驗證jwt的方法
async decodeJwt(token) {
try {
return jwt.verify(token, secert_key);
} catch (err) {
return err;
}
}
}
module.exports = TokenService;
這是用戶控制器中的登陸方法 登陸成功后
async login() {
const { ctx } = this;
// 用戶名和密碼
const { username, password } = ctx.request.body;
// 驗證登錄
const result = await ctx.service.user.login(username, password);
if (result) {
console.log('登陸成功');
// 生成token
const token = await ctx.service.token.signJwt(result.id);
// 將token寫入cookie 這是返回在客戶端cookie中的token
this.ctx.cookies.set('token', token, { maxAge: 60 * 1000, httpOnly: false, overwrite: true, signed: false });
}
const data = { ...result };
// 后端返回數(shù)據(jù)
ctx.body = data;
}
接下來是前端vue
前端
在axios的配置攔截器時獲取cookie中的token ,然后將 token 賦值給 請求頭 header中的 authorization 字段
// 添加請求攔截器
service.interceptors.request.use(
config => {
//下方注釋就是獲取cookie中的某一個值 應(yīng)該封裝起來 為了方便觀看寫在此處
/*
function getCookie(name) {
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
// eslint-disable-next-line no-cond-assign
if (arr = document.cookie.match(reg))
return (arr[2]);
else
return null;
}
*/
// 從cookie中獲取token
let token = getCookie('token');
if (token) {
// token 賦值給 請求頭 header中的 authorization 字段
config.headers.authorization = token;
}
return config
},
err => console.log(err)
)
這樣再請求的時候都會帶上這個請求頭,后端在獲取 token , 進行驗證即可
jwt 驗證步驟總結(jié)
1. 用戶輸入其登錄信息
2. 服務(wù)器驗證信息是否正確品洛,并返回已簽名的token
3. token儲在客戶端树姨,例如存在local storage或cookie中
4. 之后的HTTP請求都將token添加到請求頭里
5. 服務(wù)器解碼JWT,并且如果令牌有效桥状,則接受請求
6. 一旦用戶注銷帽揪,令牌將在客戶端被銷毀,不需要與服務(wù)器進行交互一個關(guān)鍵是辅斟,令牌是無狀態(tài)的转晰。后端服務(wù)器不需要保存令牌或當前session的記錄。