如何在 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 + 护照)