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

Schema First模式下NestJS GraphQL控制器如何获取请求头?

在Nest GraphQL Schema First模式下获取请求头实现AuthGuard验证

在Nest GraphQL中,不管是Schema First还是Code First模式,ExecutionContext都需要转换成GraphQLExecutionContext来获取GraphQL请求的上下文信息,直接使用switchToHttp()仅适用于REST API场景,无法拿到GraphQL请求的请求头。

修改你的AuthGuard代码如下:

import { ExecutionContext, Injectable, CanActivate, Logger } from '@nestjs/common';
import { GraphQLExecutionContext } from '@nestjs/graphql';
import { AuthService } from './auth.service';
import { inspect } from 'util';

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private readonly authService: AuthService) {
    Logger.debug(`starting AuthGuard...`);
  }

  async canActivate(context: ExecutionContext): Promise<boolean> {
    // 将通用ExecutionContext转换为GraphQL专用上下文
    const gqlContext = GraphQLExecutionContext.create(context);
    // 获取底层HTTP请求对象(Express/Fastify实例)
    const request = gqlContext.getContext().req;

    Logger.debug(`canActivate? ${inspect(request)}`);

    try {
      if (!request?.headers?.authorization) {
        Logger.debug(`No Authorization header found`);
        return false;
      }

      // 提取纯token(去除"Bearer "前缀)
      const token = request.headers.authorization.replace('Bearer ', '');
      const user = await this.authService.userProfileInfo(token);

      if (user?.data?.email) {
        Logger.debug(`canActivate :D!!`);
        // 可将用户信息挂载到请求对象,供后续Resolver直接使用
        request.user = user.data;
        return true;
      }

      Logger.debug(`Invalid user profile`);
      return false;
    } catch (error) {
      Logger.debug(`cannotActivate D:!! Error: ${error.message}`);
      return false;
    }
  }
}

关键细节说明:

  • GraphQLExecutionContext.create(context):完成通用上下文到GraphQL上下文的转换,这是获取请求头的核心步骤
  • gqlContext.getContext().req:拿到的是HTTP框架(Express/Fastify)的原生请求实例,包含完整的请求头、参数等信息
  • 主动去除Bearer 前缀:确保传给验证服务的是纯token字符串,避免格式不匹配导致验证失败

内容的提问来源于stack exchange,提问作者Flávio Costa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:02:11