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

如何在NextAuth路由处理器中获取会话令牌(GoogleProvider场景)

解决NextAuth getServerSession无法获取会话的问题

问题原因

在App Router中使用getServerSession时,仅传递{request}是不够的,必须同时传入NextAuth的配置选项(authOptions),否则方法无法正确验证并获取会话信息。

修复步骤

1. 抽离并导出NextAuth配置

修改api/auth/[...nextauth]/route.ts,将NextAuth的配置单独导出为authOptions,方便其他路由复用:

import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";

// 导出配置供其他路由调用
export const authOptions = {
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID!!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!!
    })
  ],
  callbacks: {
    async jwt({ token, account, user }) {
      if (account) {
        token.accessToken = await SignToken(user.email as string);
        token.id = user.id;
      }
      return token;
    },
    async session({ session, token, user }) {
      session.user = token;
      return session;
    }
  }
};

const handler = NextAuth(authOptions);

export { handler as GET, handler as POST };

2. 在目标路由中传入配置调用getServerSession

修改api/generate/route.ts,导入authOptions并传入getServerSession:

import { getServerSession } from "next-auth";
import { authOptions } from "../auth/[...nextauth]/route";

export async function POST(request: Request) {
  // 同时传入authOptions和request
  const session = await getServerSession(authOptions, { request });

  // 验证会话是否存在
  if (!session) {
    return new Response(JSON.stringify({ error: "未授权访问" }), { status: 401 });
  }

  // 后续业务逻辑
  return new Response(JSON.stringify({ data: "success", user: session.user }), { status: 200 });
}

额外检查

  • 确保SignToken函数能正常生成并返回令牌,避免在jwt回调中出现错误导致会话无法正确生成
  • 环境变量GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET已正确配置且生效

内容的提问来源于stack exchange,提问作者Captai-N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:03:21