如何在GraphQL上下文(context)中获取有效的next-auth用户会话
解决方案
核心原因是getSession仅能识别Next.js封装后的请求对象,你直接传入Apollo原生的IncomingMessage缺少Next.js对Cookie、请求头的预处理逻辑,所以始终返回null。可按以下步骤修正:
方式1:Pages Router下挂载Apollo时直接处理会话
不要单独在上下文文件里调用getSession,直接在Next.js的GraphQL API路由中处理,这里的请求对象是Next封装后的,可直接被getSession识别:
// pages/api/graphql.ts import { ApolloServer } from '@apollo/server' import { startServerAndCreateNextHandler } from '@as-integrations/next' import { getSession } from 'next-auth/react' import { prisma } from '../../prisma/client' import type { NextApiRequest, NextApiResponse } from 'next' // 引入你自己的typeDefs和resolvers import { typeDefs } from './typeDefs' import { resolvers } from './resolvers' const server = new ApolloServer({ typeDefs, resolvers }) export default startServerAndCreateNextHandler(server, { context: async (req: NextApiRequest, res: NextApiResponse) => { const session = await getSession({ req }) let user = null if (session?.user?.email) { user = await prisma.user.findUnique({ where: { email: session.user.email } }) } return { db: prisma, prisma, user, req, res } } })
方式2:App Router下适配处理
如果使用Next.js 13+ App Router,直接用NextAuth v5+提供的auth()方法即可,不需要手动传请求对象:
// app/api/graphql/route.ts import { ApolloServer } from '@apollo/server' import { startServerAndCreateNextHandler } from '@as-integrations/next' import { auth } from '@/auth' // 你的NextAuth配置导出的auth方法 import { prisma } from '@/prisma/client' const server = new ApolloServer({ typeDefs, resolvers }) const handler = startServerAndCreateNextHandler(server, { context: async () => { const session = await auth() let user = null if (session?.user?.email) { user = await prisma.user.findUnique({ where: { email: session.user.email } }) } return { db: prisma, prisma, user } } }) export { handler as GET, handler as POST }
必做配置项
- 前端Apollo Client的请求配置必须添加
credentials: 'include',否则浏览器不会携带NextAuth的会话Cookie发送给GraphQL端点,示例:
// 前端Apollo Client配置 import { createHttpLink } from '@apollo/client' const httpLink = createHttpLink({ uri: '/api/graphql', credentials: 'include' // 必须加这行 })
- 如果是跨域部署的场景,需要在NextAuth配置里添加对应的域名到
trustedOrigins列表。
内容的提问来源于stack exchange,提问作者justfiguringitout
相关产品推荐
相关产品推荐

