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	# 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值