Este resumen proporciona una guía sobre cómo configurar correctamente JWT en NestJS, especialmente para el uso de algoritmos RSA como RS256.
El problema suele estar en la configuración incorrecta del JwtModule
y la instancia de JwtStrategy
. Es crucial especificar los algoritmos utilizados para firmar y verificar los tokens, junto con las claves correspondientes.
Para verificar si los tokens se generan con el algoritmo RS256, revisa el encabezado del token en jwt.io. Si muestra HS256, significa que el algoritmo correcto no se usó para firmar el token.
@Module({
imports: [
ConfigModule,
JwtModule.registerAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => {
const options: JwtModuleOptions = {
privateKey: configService.get('JWT_PRIVATE_KEY'),
publicKey: configService.get('JWT_PUBLIC_KEY'),
signOptions: {
expiresIn: '3h',
algorithm: 'RS256',
},
};
return options;
},
inject: [ConfigService],
}),
],
providers: [AuthService, JwtStrategy],
exports: [AuthService],
controllers: [AuthController],
})
export class AuthModule {}
@Injectable()
export class AuthService {
constructor(private jwtService: JwtService) {}
async generateToken(user: User, signOptions: jwt.SignOptions = {}): Promise<AuthJwtToken> {
const payload = { sub: user.id, email: user.email, scopes: user.roles };
return {
accessToken: this.jwtService.sign(payload, signOptions),
};
}
}
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private configService: ConfigService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: configService.get('JWT_PUBLIC_KEY'),
algorithms: ['RS256'],
});
}
async validate(payload: any) {
const { sub: userId, email, scopes: roles } = payload;
return {
id: userId,
email,
roles,
};
}
}
Puedes usar la misma JwtStrategy
en otros microservicios. Comparte la PUBLIC_KEY
con los otros servicios, ya sea manualmente o a través de un endpoint de API. Recuerda no compartir ni exponer la PRIVATE_KEY
.
Nota: Este código asume la existencia de un ConfigService
que proporciona el par de claves RSA desde variables de entorno. Se sugiere encarecidamente