Nest JS添加了另一个密钥,以使用@ nestjs / jwt

时间:2020-01-17 12:56:28

标签: jwt nestjs jwt-auth

我正在尝试使用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 个答案:

答案 0 :(得分:1)

如果我对您的理解正确。看来您要尝试两种不同的策略来签署两种不同类型的令牌?如果是这样,您只需要使用多个命名策略即可。

在声明中,您可能会执行以下操作:

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 :(得分:0)

@nestjs/jwt 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 将使用备用参数