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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:45:05