Loading

node 登陆拦截中间件(egg)

middleware/jwt.js

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: '您还没有登录,请登陆后再进行操作'
            }
        }
    };
}
posted @ 2021-01-22 16:28  冯叶青  阅读(377)  评论(0编辑  收藏  举报