You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:27:35