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

