6

我喜欢实施多个命名的 passport-JWT 策略,每个策略都有自己的secret. 有什么办法可以实现吗?据我从文档中了解到,在模块初始化期间只能注册一个秘密:

@Module({
  imports: [
    UsersModule,
    PassportModule,
    JwtModule.register({
      secret: jwtConstants.secret,
      signOptions: { expiresIn: '60s' },
    }),
  ],
  providers: [AuthService, LocalStrategy],
  exports: [AuthService, JwtModule],
})
4

2 回答 2

6

为了允许注册同一服务的多个变体,您将需要在JwtModule. 它可能看起来像这样:

@Module({
  imports: [JwtModule.register({
    secret: secret1,
    signOptions: { expiresIn: '60s' },
  })],
  providers: [{
    provide: 'JwtSecret1Service',
    useExisting: JwtService,
  }],
  exports: ['JwtSecret1Service'],
})
export class JwtSecret1Module {}

现在你可以@Inject('JwtSecret1Service')使用这个特定的配置,只要JwtSecret1Module已经添加到imports消费模块中。您可以使用任意数量的变体来执行此操作JwtService,并且每个变体都将拥有自己的配置

于 2021-05-21T17:14:09.930 回答
0

我最近创建了一个包来管理它,扩展了 passport-jwt 以允许将一组 passport-jwt 配置传递给构造函数。当请求到达时,使用标准的 passport-jwt 代码并行检查每个配置,以查看是否应该授权 JWT。

这是包:https ://www.npmjs.com/package/@mestrak/passport-multi-jwt 。

jwt.strategy.ts在 NestJS 中,你会在(或任何你的策略设置文件被调用)中做这样的事情。

import { ExtractJwt, Strategy } from '@mestrak/passport-multi-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super([{
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: 'a_secret_key',
    },
    {
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: 'another_secret_key',
    }]);
  }

  async validate(payload: any) {
    return payload;
  }
}
于 2022-02-04T16:39:22.183 回答