1

我正在尝试在 nestjs 后端实现 RS256 JWT 令牌。我遵循了nestjs 文档中提供的示例。

在我的模块中,我JwtModule使用我的私钥注册:

@Module({
    imports: [
       PassportModule.register({ defaultStrategy: 'jwt' }),
       JwtModule.register({
         secretOrPrivateKey: extractKey(`${process.cwd()}/keys/jwt.private.key`),
         signOptions: {
            expiresIn: 3600,
         },
       }),
    ],
    controllers: [AuthController],
    providers: [AuthService, JwtStrategy, HttpStrategy],
})
export class AuthModule {}

我可以调用 auth/token 端点并获取令牌,但是当我尝试访问受保护的端点时,我总是得到 401。

您可以在下面找到我的自定义JwtStrategy

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
   constructor(private readonly authService: AuthService) {
      super({
          jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
          secretOrKey: extractKey(`${process.cwd()}/keys/jwt.public.key`),
      });
   }

   async validate(payload: JwtPayload) {
       console.log('JwtStrategy');
       const user = await this.authService.validateUser(payload);
       if (!user) {
           throw new UnauthorizedException();
       }
       return user;
   }
}

和受保护的端点:

@Controller('auth')
export class AuthController {
   constructor(private readonly authService: AuthService) {}

   @Get('token')
   async createToken(): Promise<any> {
      return await this.authService.createToken();
   }

   @Get('data')
   @UseGuards(AuthGuard())
   findAll() {
      console.log('Guarded endpoint');
      // This route is restricted by AuthGuard
      // JWT strategy
   }
}

我假设当我调用 auth/data 时,我应该在控制台中至少看到我在 validate 方法中登录的“JwtStrategy”字符串。不幸的是,它从未出现过。为什么从不调用 validate 方法?

请在下面找到代码框

编辑 Nest.js JWT 身份验证

4

3 回答 3

4

JwtModule您必须在和中指定 RS256 作为算法JwtStrategy

export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private readonly authService: AuthService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: publicKey,
      algorithms: ['RS256'],
      ^^^^^^^^^^^^^^^^^^^^^^
    });

JwtModule.register({
  secretOrPrivateKey: privateKey,
  signOptions: {
    expiresIn: 3600,
    algorithm: 'RS256',
    ^^^^^^^^^^^^^^^^^^^
  },
}),
于 2019-03-10T20:37:36.147 回答
0

不确定它是否有效,但你可以试试这个

@UseGuards(AuthGuard('jwt'))

在您的受保护路线上方。

于 2020-08-13T05:01:37.733 回答
0

公钥和/或私钥文件很可能不是以 RS256 格式生成的。

我建议尝试以下方法:

https://gist.github.com/ygotthilf/baa58da5c3dd1f69fae9

于 2021-11-30T19:25:51.767 回答