首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nestjs护照- JWT忽略JWT签名

Nestjs护照- JWT忽略JWT签名
EN

Stack Overflow用户
提问于 2020-09-06 02:02:11
回答 1查看 483关注 0票数 0

我不能在这里传递任何秘密,因为它存储在每个用户的Redis中,在访问用户id以获取他们的秘密之前,我必须解析令牌体。使用nestjs作为体系结构。有没有任何优雅的解决方案,而不必自己写完整的战略副本?

代码语言:javascript
复制
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private authService: AuthService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: ???,
      passReqToCallback: true,
    });
  }

  async validate(req: any, payload: UserType): Promise<UserType> {
    try {
      const token = ExtractJwt.fromAuthHeaderAsBearerToken()(req);

      const [header, body] = token.split('.');

      const headerJSON = JSON.parse(btoa(header)) as { alg: Algorithm };
      const bodyJSON = JSON.parse(btoa(body)) as UserType;

      const sub = bodyJSON.sub;

      const userId = await this.authService.findUserSecret(sub);

      const jwt = new JwtService({
        secret: userId,
      });

      await jwt.verify(token, {
        algorithms: [headerJSON.alg],
      });

      return payload;
    } catch (e) {
      return Promise.reject();
    }
  }
}```
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-06 02:19:33

做了更多的研究并发现

代码语言:javascript
复制
      secretOrKeyProvider(request: any, rawJwtToken: string, done: any) {
        const [, body] = rawJwtToken.split('.');

        const bodyJSON = JSON.parse(btoa(body)) as UserType;

        const { sub } = bodyJSON;

        authService
          .findUserSecret(sub)
          .then(secret => secret || Promise.reject())
          .then(secret => done(null, secret))
          .catch(error => done(error, null));
      },
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63760069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档