在做egg-jwt鑒權(quán)之前,需先設(shè)置跨域請(qǐng)求
// config.default.js
// 跨域設(shè)置
config.security = {
csrf: {
enable: false
},
domainWhiteList: [ '*' ]
};
config.cors = {
origin: '*',
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS'
};
安裝egg-jwt
npm i egg-jwt --save
配置plugin.js
// plugin.js
// 鑒權(quán)
jwt: {
enable: true,
package: "egg-jwt"
}
在config.default.js配置中間件
// config.default.js
config.middleware = [ 'errorHandler','tokenHandler' ];
// 中間件執(zhí)行匹配開啟
config.tokenHandler = {
match(ctx) { // 只匹配指定路由蹬癌,反之如果只忽略指定路由权她,可以用ignore
//匹配不需要驗(yàn)證token的路由
const url = ctx.request.url;
if (url.startsWith('/login')) {
// ctx.logger.info('config.tokenHandler:','關(guān)閉token驗(yàn)證')
return false;
} else {
// ctx.logger.info('config.tokenHandler:','開啟token驗(yàn)證')
return true; // 開啟中間件,開啟token驗(yàn)證
}
}
};
無論是應(yīng)用層加載的中間件還是框架自帶中間件逝薪,都支持幾個(gè)通用的配置項(xiàng):
enable:控制中間件是否開啟隅要。
match:設(shè)置只有符合某些規(guī)則的請(qǐng)求才會(huì)經(jīng)過這個(gè)中間件。
ignore:設(shè)置符合某些規(guī)則的請(qǐng)求不經(jīng)過這個(gè)中間件董济。
三種配置項(xiàng)不要同時(shí)使用否則不生效步清!
egg中間件使用規(guī)則
tokenHandler jwt解碼中間件
'use strict';
module.exports = (options) => {
return async function(ctx, next) {
const token = ctx.request.header.authorization;
let decode = '';
if (token) {
try {
// 解碼token
decode = ctx.app.jwt.verify(token, options.secret);//驗(yàn)證token
console.log('decode======>', decode);
// 獲取用戶信息
ctx.decode = decode;
} catch (error) {
ctx.status = 401;
ctx.body = {
message: error.message,
};
return;
}
//切記先解析token并存儲(chǔ)數(shù)據(jù)后再執(zhí)行回調(diào),否則解析數(shù)據(jù)獲取不到x
await next();
} else {
ctx.status = 401;
ctx.body = {
message: '沒有token',
};
return;
}
};
};
helper.js生成token
// 有效時(shí)間為30分鐘
exports.getToken = function(options) {
return this.app.jwt.sign(options, this.app.config.jwt.secret, { expiresIn: '1800s' });
};
在server層使用helper生成的token
class LoginService extends Service {
async login() {
const { ctx } = this;
const { username, password } = ctx.request.body;
const [ User ] = await ctx.model.User.findAll({
where: {
username,
password
}
});
if (User) {
// 生成token
const token = ctx.helper.getToken({ username, password });
console.log(token)
return ctx.helper.success({ ctx, res: { login: true, token, id: User.id }, msg: '登錄成功!' });
} else {
return ctx.helper.success({ ctx, res: { login: false }, msg: '用戶名密碼錯(cuò)誤廓啊!' });
}
}
}
在server層使用 使用token解析后的數(shù)據(jù)
async getUserInfo() {
const { ctx, app } = this;
// 獲取token解析后的用戶信息
const { username, password } = ctx.decode;
const [ User ] = await ctx.model.User.findAll({
where: {
username,
password
}
});
return ctx.helper.success({ ctx, res:User, msg: '請(qǐng)求成功欢搜!' });
}
本代碼為個(gè)人項(xiàng)目使用,有問題請(qǐng)查證版本