如何在 Nest.JS 中使用多个 Secret 实现多个 JWT 策略

Posted

技术标签:

【中文标题】如何在 Nest.JS 中使用多个 Secret 实现多个 JWT 策略【英文标题】:How to implement multiple JWT strategies using multiple secrets in Nest.JS 【发布时间】:2021-08-10 10:37:21 【问题描述】:

我喜欢实施多个命名的 passport-JWT 策略,每个策略都有自己的 secret。有什么办法可以实现吗? 从documentation了解到,模块初始化时只能注册一个secret:

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

【问题讨论】:

【参考方案1】:

要允许注册同一服务的多个变体,您将需要在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 变体来执行此操作,并且每个变体都有自己的配置

【讨论】:

还有其他需要注意的配置吗?对我来说,这仍然使用初始的 JwtService 你为每个你想使用的JwtService 做这个模块,然后在你需要新服务的地方导入这个模块。然后用具体的名字代替JwtService @JayMcDoniel 您能否展示在同一模块中使用此实例的示例?我就是不能来这里。 不能在同一个模块中进行。这就是为什么您必须使用 useExisting 和自定义提供程序名称来完成这些单独的模块

以上是关于如何在 Nest.JS 中使用多个 Secret 实现多个 JWT 策略的主要内容,如果未能解决你的问题,请参考以下文章

无论如何在 Nest.js 中使用 Fastify 获取请求、响应的类型接口

如何在没有守卫装饰器的情况下始终验证 JWT? (Nest.js + 护照)

如何在 Nest.js 中参考打字稿源打印堆栈跟踪

如何正确使用 Nest.js 的 @Headers?

如何在单元测试 Nest.js 中测试抛出新的 HttpException

Nest.js 在护照本地策略中获取请求标头