如何在NestJS控制器中获取JwtStrategy返回的payload载荷?
解决方案
NestJS中Passport的AuthGuard('jwt')验证通过后,会自动将JwtStrategy里validate方法返回的内容挂载到HTTP请求对象的user属性上,你可以通过以下两种方式获取:
方法1:直接通过请求对象获取
从@nestjs/common导入Req装饰器,搭配Express的Request类型使用即可:
import { Controller, Get, UseGuards, Req } from '@nestjs/common'; import { Request } from 'express'; export class AuthController { constructor(private authService: AuthService) {} @UseGuards(AuthGuard("jwt")) @Get() getPayload(@Req() req: Request) { // req.user 就是JwtStrategy中validate返回的payload const payload = req.user; return payload; } }
方法2:自定义参数装饰器(更简洁)
如果需要频繁获取用户信息,可以封装专用的参数装饰器,避免每次都手动操作请求对象:
- 首先创建装饰器文件
user.decorator.ts:
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; export const GetUser = createParamDecorator( (field?: string, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); const user = request.user; // 支持指定返回payload的单个字段,不传则返回完整payload return field ? user?.[field] : user; }, );
- 控制器中直接使用:
import { Controller, Get, UseGuards } from '@nestjs/common'; import { GetUser } from './user.decorator'; export class AuthController { constructor(private authService: AuthService) {} @UseGuards(AuthGuard("jwt")) @Get() getPayload(@GetUser() payload: any) { // 直接拿到完整payload return payload; } // 也可以指定获取payload的单个字段,比如获取用户id @Get('id') getUserId(@GetUser('id') userId: number) { return userId; } }
内容的提问来源于stack exchange,提问作者Овов Очоы
相关产品推荐
相关产品推荐

