白名单

app/config.default.js

1
exports.super_white_list = ["/user/login", "/user/registry"];

应用及中间件

通过 middleware 拦截请求,判断是否传递 token,校验 token 与服务器是否一致,实现用户权限的控制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const jwt = require("jsonwebtoken");

module.exports = function (app) {
return async (ctx, next) => {
const inWhiteList = ctx.app.config.super_white_list.filter(
(router) => router === ctx.request.url
);

if (inWhiteList.length) {
// 如果当前路由在超级白名单. 跳过鉴权(鉴定权限)
return await next();
}
// // 没有传递token返回401
const authorization = ctx.request.header["authorization"];
if (!authorization) {
ctx.status = 401;
ctx.body = {
code: 0,
msg: "没有权限访问",
};
return;
}
// 传递token

// 判断前端token与服务器端session保存的token是否一致
const token = ctx.session[ctx.request.header["uid"] + "token"];
// 不一致
if (authorization !== token) {
ctx.status = 401;
ctx.body = {
code: 0,
msg: "token被篡改",
};
return;
}
// 一致
const tokenObj = jwt.verify(authorization, "123", (err, obj) => {
if (err) return false;
return obj;
});
const currentTime = new Date().getTime();
const createTime = tokenObj.tim;
// 一分钟后过期
if ((currentTime - createTime) / 1000 / 60 > 1) {
ctx.status = 401;
ctx.body = {
code: 0,
msg: "token过期",
};
return;
}
await next();
};
};