NestJs + Passport - 永远不会使用 RS256 令牌调用 JWTStrategy
NestJs + Passport - JWTStrategy never being called with RS256 tokens
我正在尝试在 nestjs 后端实现 RS256 JWT 令牌。我遵循了 nestjs documentation 中提供的示例。
在我的模块中,我用我的私钥注册了 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 时,我应该至少在控制台中看到我在验证方法中登录的 "JwtStrategy" 字符串。不幸的是它永远不会出现。为什么从不调用验证方法?
请找到下面的代码和框
您必须在 JwtModule
和 JwtStrategy
中指定 RS256 作为算法:
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',
^^^^^^^^^^^^^^^^^^^
},
}),
不确定是否有效,但您可以试试这个
@UseGuards(AuthGuard('jwt'))
在您的受保护路线上方。
很可能 public 密钥 and/or 私钥文件不是以 RS256 格式生成的。
我建议您尝试以下方法:
我正在尝试在 nestjs 后端实现 RS256 JWT 令牌。我遵循了 nestjs documentation 中提供的示例。
在我的模块中,我用我的私钥注册了 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 时,我应该至少在控制台中看到我在验证方法中登录的 "JwtStrategy" 字符串。不幸的是它永远不会出现。为什么从不调用验证方法?
请找到下面的代码和框
您必须在 JwtModule
和 JwtStrategy
中指定 RS256 作为算法:
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',
^^^^^^^^^^^^^^^^^^^
},
}),
不确定是否有效,但您可以试试这个
@UseGuards(AuthGuard('jwt'))
在您的受保护路线上方。
很可能 public 密钥 and/or 私钥文件不是以 RS256 格式生成的。
我建议您尝试以下方法: