Nest JS使用@nestjs/jwt添加另一个秘钥以刷新令牌

4

我正在尝试使用访问和刷新令牌在NestJs上进行身份验证。正如我在nestjs文档中看到的那样,我应该在auth模块中注册我的秘密密钥。我已经做到了这一点。

@Module({
  imports: [
    MongooseModule.forFeature([{ name: 'RefreshToken', schema: RefreshTokenSchema }]),
    UsersModule,
    PassportModule,
    JwtModule.register({
      secret: jwtConstants.secret,
    }),
  ],
  providers: [AuthService, LocalStrategy, JwtStrategy],
  controllers: [AuthController],
})
export class AuthModule {}

这个秘钥在我创建身份认证服务的令牌时使用。

import { JwtService } from '@nestjs/jwt';
const accessToken = this.jwtService.sign(payload, { expiresIn: '60s'});
const refreshToken = this.jwtService.sign(payload, { expiresIn: '24h' });

当我尝试在this.jwtService.sign函数中设置秘钥时,如下:

const accessToken = this.jwtService.sign(payload, 'secretkey' ,{ expiresIn: '60s'})

我遇到了一个错误。它告诉我函数只能接收两个参数。那么该如何创建两个秘钥并相互使用以获取正确的令牌呢?

2个回答

5

如果我理解得正确,您似乎想要针对两种不同类型的令牌使用两种单独的签名策略? 如果是这样,您只需要使用多个命名策略。

在您的声明中,您可以尝试以下操作:

export class JwtStrategy extends PassportStrategy(Strategy, 'accessToken') {}

export class JwtStrategy2 extends PassportStrategy(Strategy, 'refreshToken') {}

现在,有了这两个不同的名称,你也可以指定默认策略,似乎是你的访问令牌。
@Module({
  imports: [
    MongooseModule.forFeature([{ name: 'RefreshToken', schema: RefreshTokenSchema }]),
    UsersModule,
    PassportModule.register({ defaultStrategy: 'accessToken' }),
    JwtModule.register({
      secret: jwtConstants.secret,
    }),
  ],
  providers: [AuthService, LocalStrategy, JwtStrategy, JwtStrategy2],
  controllers: [AuthController],
})
export class AuthModule {}

这样做可以让你在构造函数中使用两种服务类型进行导入。

然后,通过单独调用每个服务来执行其分配的任务,您上面的代码应该可以用于不同时间签署!我没有运行过这段代码,但稍微调整一下应该可以工作。


1
我有一个类似的问题。但是我需要每个策略不同的超时时间。这可行吗? - Akhileshwar Reddy
2
你能否在服务中更改令牌签名呢? - Jarred Parr
2
在这种情况下,我该如何使用第二个jwtService - ZungTa

3

@nestjs/jwt JwtService允许您向sign()方法传递选项。

您可以仅使用默认值调用JwtService.sign(),也可以根据需要传递选项。

let token = this.jwtService.sign(payload);
let refreshToken = this.jwtService.sign(payload, {
  secret: jwtConstants.jwt_refresh_secret,
  expiresIn: jwtConstants.jwt_refresh_expire
});

token 使用您注册服务时使用的参数,而refreshToken 将使用备用参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接