在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
相关产品推荐
相关产品推荐

