NestJs + Passport - JWTStrategy никогда не вызывается с токенами RS256

Я пытаюсь реализовать токены RS256 JWT в бэкэнде nestjs. Я последовал примеру, приведенному в документации 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 {}

Я могу вызвать конечную точку аутентификации / токена и получить токен, но когда я пытаюсь получить доступ к защищенной конечной точке, я всегда получаю 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, я должен видеть в консоли хотя бы строку «JwtStrategy», которую я регистрирую в методе проверки. К сожалению, он никогда не появляется. Почему никогда не вызывается метод проверки?

Пожалуйста, найдите коды и поле ниже

 Редактировать Nest.js JWT Auth


person jmazur    schedule 10.03.2019    source источник


Ответы (2)


Вы должны указать RS256 как алгоритм для JwtModule и 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',
    ^^^^^^^^^^^^^^^^^^^
  },
}),
person Kim Kern    schedule 10.03.2019
comment
Пример в вашемcodeandbox также работает для меня. Но он реализует обычные токены HS256. Как я уже писал в своем вопросе, проблема связана с токенами RS256, поэтому они подписаны сертификатом RSA. - person jmazur; 11.03.2019
comment
Взгляните на мою песочницу кода - я добавил ссылку в свой вопрос. - person jmazur; 11.03.2019
comment
Извините, мой предыдущий ответ был неверным. Смотрите мое редактирование - person Kim Kern; 11.03.2019
comment
Помимо указания имени алгоритма в JwtModule и JwtStrategy, я бы только добавил, что важно также иметь ключи в правильном формате. Закрытый и открытый ключи должны быть в формате RSA. Мой открытый ключ был предоставлен в формате SSH2, и поэтому он не работал. - person jmazur; 11.03.2019

Не уверен, работает ли это, но вы можете попробовать это

@UseGuards(AuthGuard('jwt'))

над вашим защищенным маршрутом.

person Chetan Jain    schedule 13.08.2020