之前我们在token中传入我们的自定义参数,现在我们要做一个token鉴权,很简单,如果他的token合法,就可以访问这个路由,如果不合法,就打回。

这个也不能说是真正意义上的鉴权,因为他还没有判断scope值,所以只能说是简单判断。

做这个判断我们就可以通过中间件的形式,于是我们在middlewares目录下创建一个auth.js文件

auth.js:

const parseBearerToken = require("@utils/paresBearerToken");
const jwt = require("jsonwebtoken");
const { tokenConfig } = require("@config/config");
const { TokenError } = require("@core/http-error");


class Auth {
  constructor() {

  }
  get token() {
    return async (ctx, next) => {
      //获取头信息中的token
      const token = parseBearerToken(ctx.header);
      //解析token
      try {
        var decode = jwt.verify(token, tokenConfig.key);
      } catch (error) {
        //token解析错误
        let errorMsg = "token解析失败"
        if (error.name === "TokenExpiredError") {
          errorMsg = "token已失效";
        };
        throw new TokenError(errorMsg);
      }

      //赋值到ctx
      ctx.auth = decode;

      //下一个中间件
      await next();
    }
  }
}


module.exports = { Auth };

在jwt中,如果token不合法,错误,或者已经过期了,通过verify解析都会抛出错误,其中如果是解析错误,catch捕获的错误对象name为"TokenExpiredError",我们通过这个判断然后给出对应的错误信息。

如果token解析成功,则会返回这么一个对象:

{ uid: 1, scope: 8, iat: 1616308366, exp: 1616315566 }

我们通过var赋值到decode变量中,由于我们后面的路由可能还需要拿到token中的信息,所以我们将decode挂载到上下文ctx的auth中,然后next下一个。

这样我们可以在下一个路由中通过ctx.auth获取到token信息。

分类: Node 标签: nodekoatoken鉴权auth

评论

暂无评论数据

暂无评论数据

目录