在 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 # types,可选
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, // 这里加上
});
};
框架实现demo可见 https://github.com/Dobility/egg-svr