middleware/jwt.js
'use strict';
module.exports = (options, app) => {
return async function userInterceptor(ctx, next) {
//获取token 获取前端或以其他方式设置的cookie需要设置signed: false属性,避免对它做验签导致获取不到 cookie 的值。
let token = ctx.cookies.get('Admin-Token', { signed: false });
//验证token是否为空
if (token){
let result = ctx.verifyToken(token) //解密token
let {_id} = result //检查是否有用户_id
//验证客户端token是否合法
if (_id) {
let redis_token = await app.redis.get(_id) // 获取redis中的token
//验证是否为最新的token
if (token === redis_token) {
await next();
}else{
// 如果不是最新token,则代表用户在另一个机器上进行操作,需要用户重新登录保存最新token
ctx.body = {
code: 402,
msg: '您的账号已在其他机器保持登录,如果继续将清除其他机器的登录状态'
}
}
}else{
// 如果token不合法,则代表客户端token已经过期或者不合法(伪造token)
ctx.body = {
code: 401,
msg: '您的登录状态已过期,请重新登录'
}
}
}else{
// 如果token为空,则代表客户没有登录
ctx.body = {
code: 401,
msg: '您还没有登录,请登陆后再进行操作'
}
}
};
}