我正在尝试在 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 方法?
请在下面找到代码框