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

在NestJS的JWTStrategy中如何获取用户JWT令牌?

JWT策略/守卫中获取原始令牌的实现方案

你可以通过两种常见方式获取原始JWT令牌,适配你的令牌作废校验场景:

方案1:在JWTStrategy中直接获取(推荐,校验逻辑更统一)

passport-jwt内置支持传递请求对象到validate回调,只需要在策略初始化时添加passReqToCallback: true配置即可:

步骤1:修改策略构造函数配置

import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { Request } from 'express';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: process.env.JWT_SECRET,
      passReqToCallback: true, // 开启后请求对象会作为validate的第一个参数传入
    });
  }

步骤2:修改validate函数获取令牌并校验作废状态

async validate(req: Request, payload: LoginPayload) {
    // 提取原始JWT令牌
    const rawToken = ExtractJwt.fromAuthHeaderAsBearerToken()(req);
    
    // 新增你的令牌作废校验逻辑:查询数据库判断令牌是否在黑名单中
    const isTokenRevoked = await yourTokenService.checkTokenRevoked(rawToken);
    if (isTokenRevoked) {
      throw new UnauthorizedException('当前登录凭证已失效,请重新登录');
    }

    const { email, firstName, lastName, sub } = payload;
    return {
      id: sub,
      email,
      firstName,
      lastName,
    };
  }
}

方案2:在JWTAuthGuard中获取

守卫层本身可以直接访问请求上下文,你可以在这一层提取令牌并处理:

import { Injectable, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ExtractJwt } from 'passport-jwt';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  async canActivate(context: ExecutionContext): Promise<boolean> {
    const req = context.switchToHttp().getRequest();
    // 提取原始令牌
    const rawToken = ExtractJwt.fromAuthHeaderAsBearerToken()(req);
    
    // 可直接在此处做令牌作废校验
    const isTokenRevoked = await yourTokenService.checkTokenRevoked(rawToken);
    if (isTokenRevoked) {
      throw new UnauthorizedException('当前登录凭证已失效,请重新登录');
    }
    
    // 也可将令牌挂载到请求对象上,供后续业务逻辑使用
    req.rawJwtToken = rawToken;
    return super.canActivate(context) as boolean;
  }
}

内容的提问来源于stack exchange,提问作者Tsuu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:15:02