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

如何在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:自定义参数装饰器(更简洁)

如果需要频繁获取用户信息,可以封装专用的参数装饰器,避免每次都手动操作请求对象:

  1. 首先创建装饰器文件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;
  },
);
  1. 控制器中直接使用:
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,提问作者Овов Очоы

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:39:01