Next.js 15 + Auth.js API路由无法获取Session问题求助
解决Next.js 15 + Auth.js API路由无法获取Session的问题
问题描述
使用Next.js 15结合Auth.js/NextAuth与App Router,尝试通过Session验证角色保护API路由,但API路由中无法获取Session信息。页面组件(src/app/dashboard/accounts/page.tsx)可正常校验Session与角色,但API路由(src/app/api/accounts/route.ts)中req.auth始终为空,控制台无相关输出,未使用middleware.ts,参考官方文档后仍未解决。
解决方案
1. 修复JWT与Session回调的角色字段缺失
你的auth.ts中注释掉了角色字段的赋值逻辑,导致Session和JWT中没有角色信息,同时影响Auth.js的Session解析。修改src/lib/auth.ts中的jwt和session回调:
async jwt({ token, account, user }) { if (account?.provider === "credentials") { token.credentials = true; token.accessToken = uuid(); } if (user) { const prismaUser = user as PrismaUser; token.id = String(prismaUser.id); token.name = prismaUser.name; token.email = prismaUser.email; token.picture = prismaUser.image; token.role = prismaUser.role; // 取消注释,将角色写入JWT token.sub = prismaUser.id; // 取消注释,确保sub字段正确关联用户ID } return token; }, async session({ token, session }) { if (token) { session.user.id = token.sub!; session.accessToken = token.accessToken as string; session.user.name = token.name; session.user.image = token.picture; session.user.role = token.role; // 取消注释,将角色同步到Session } return session; },
2. 调整API路由的Session获取方式
改用在API路由内部直接调用auth()函数,替代包装器写法(避免版本兼容问题):
修改src/app/api/accounts/route.ts:
import { NextResponse } from "next/server"; import { auth } from "@/lib/auth"; import { checkPermissions } from "@/lib/permissions"; export const GET = async () => { const session = await auth(); if (!session) { return NextResponse.json({ message: "未授权" }, { status: 401 }); } // 新增角色权限校验 if (!checkPermissions(session.user, "view", "accounts")) { return NextResponse.json({ message: "无访问权限" }, { status: 403 }); } console.log(session); return NextResponse.json(session); };
3. 完善环境变量配置
确保.env.local中配置了Auth.js必需的环境变量,否则Session无法正常存储和读取:
NEXTAUTH_URL=http://localhost:3000 NEXTAUTH_SECRET=your-random-secret-key # 可通过`openssl rand -hex 32`生成
4. 验证Cookie传递逻辑
- 确认页面中的
fetch请求已添加credentials: "include"(你的代码已正确设置) - 检查浏览器Cookie中是否存在
next-auth.session-token字段,确保请求时Cookie正常传递到API路由 - 确保
process.env.NEXT_PUBLIC_API_URL与当前域名一致,避免跨域导致Cookie丢失
5. 同步类型定义与数据库模型
确认Prisma的User模型中存在role字段,且src/types/next-auth.d.ts中的类型定义与数据库模型一致,避免类型不匹配导致Session字段丢失。
测试步骤
- 重启Next.js开发服务器
- 重新登录账号,确保Session正确创建
- 访问
/dashboard/accounts页面,发起API请求 - 查看服务器控制台,确认Session信息已正常输出
内容的提问来源于stack exchange,提问作者Hannes
相关产品推荐
相关产品推荐

