如何在@nestjs/passport的Passport-JWT策略中获取原始JWT令牌
解决NestJS中JWT策略validate方法获取原始令牌的问题
要在validate方法里拿到原始JWT令牌,你可以在令牌提取阶段把原始值挂载到请求对象上,具体实现如下:
1. 修改JWT提取逻辑,挂载原始令牌到请求对象
在jwtFromRequest回调里,拿到原始refresh token后,直接把它赋值给请求对象的自定义属性(比如rawRefreshToken):
import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { PassportStrategy } from '@nestjs/passport'; import { Request } from 'express'; import { ExtractJwt, Strategy } from 'passport-jwt'; // 扩展Express Request类型,添加自定义属性 declare global { namespace Express { interface Request { rawRefreshToken?: string; } } } @Injectable() export class JwtRefreshStrategy extends PassportStrategy( Strategy, 'jwt-refresh', ) { constructor(configService: ConfigService) { super({ jwtFromRequest: (req: Request) => { const refreshToken = req.cookies?.refresh_token; if (!refreshToken) { throw new HttpException('error msg', HttpStatus.UNAUTHORIZED); } // 把原始令牌挂载到请求对象上 req.rawRefreshToken = refreshToken; return refreshToken; }, ignoreExpiration: false, secretOrKey: configService.get<string>('JWT_REFRESH_SECRET'), }); } async validate(req: Request, payload: any) { // 这里就能拿到原始JWT令牌了 const rawToken = req.rawRefreshToken; console.log('原始JWT令牌:', rawToken); // 你的业务逻辑代码 return { payload, rawToken }; } }
2. 关键说明
- 扩展
Express.Request类型是为了让TypeScript识别自定义的rawRefreshToken属性,避免类型报错 - 挂载到请求对象上的原始令牌会随着请求生命周期传递,在
validate方法中可以直接访问 - 这种方式不会影响Passport-JWT原本的解码和验证逻辑,只是额外把原始值保留下来
内容的提问来源于stack exchange,提问作者nayounsang
相关产品推荐
相关产品推荐

