egg-shell-decorators结合egg-jwt实现token验证

在 egg.js 搭建服务端框架过程中,我使用了装饰器 egg-shell-decorators 来简化我的 controller 配置 router,同时用了 egg-jwt 来进行身份验证,按照其文档的配置过程之后,我还是遇到了坑。

如果你使用了 egg-jwt,那默认所以路由都需要进行身份校验

原文链接:https://super2god.github.io/egg-shell-decorators/#/?id=jwt

按文档说,引入 egg-jwt 后,会自动验证 token,除非加上 @IgnoreJwt 或 @IgnoreJwtAll。但实际运行时,发现所有路由都不会进行 token 检查。通过 debug 发现,在 egg-shell-decorators/index.js 中有这样几行:

178: if (!ignoreJwt && !ignoreJwtAll && jwt && options.jwtValidation) {
179:   await options.jwtValidation()(ctx, next);
180: }

可以看到有个 options.jwtValidation,在 debug 时发现它始终为 undefined,所以所有路由都不会进行验证。而文档中,options 的选项并没有提到过这个!或许是 egg-jwt 没有自动挂上,也或许是 egg-shell-decorators 的遗漏。

因此,解决方法就是自己挂上这个方法。同时发现 egg-jwt 的 verify 不能直接用(编译过程时即报错),所以还是用最原始的 jsonwebtoken

// 安装 jsonwebtoken
$ npm i jsonwebtoken -S
$ npm i @types/jsonwebtoken -D

// app/middleware/jwt.ts
export default () => async (ctx, next) => {
  // 使用 jsonwebtoken 的 verfiy 检查 token
  await next();
};

// app/router.ts
import jwt from '../app/middleware/jwt';
export default (app: Application) => {
  EggShell(app, {
    prefix: '/',
    quickStart: true,
    jwtValidation: jwt,		// 这里加上
  });
};

更详细的框架内容请见 https://github.com/Dobility/egg-svr

你可能感兴趣的:(NodeJS)