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

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字段丢失。


测试步骤

  1. 重启Next.js开发服务器
  2. 重新登录账号,确保Session正确创建
  3. 访问/dashboard/accounts页面,发起API请求
  4. 查看服务器控制台,确认Session信息已正常输出

内容的提问来源于stack exchange,提问作者Hannes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:23:18