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

