Next.js 15集成Next-Auth出现未知错误,寻求解决方案
Next.js 15 + Next-Auth身份验证未知错误排查求助
升级至Next.js 15版本后,使用Next-Auth实现身份验证时出现未知错误,此前使用Next.js 14.x.x版本时无此问题。相关代码及错误截图如下:
相关代码文件
1. LoginOrHello组件
import { authOptions } from "@/lib/auth"; import styles from "./styles.module.scss"; import Link from "next/link"; import { AiOutlineUser } from "react-icons/ai"; import { getServerSession } from "next-auth"; export const LoginOrHello = async () => { const session = await getServerSession(authOptions); return ( <Link href={session ? "#" : "/login"} className={styles.iconLink}> <AiOutlineUser /> <span>{session ? `Hello, ${session.user.email}` : "LOGIN"}</span> </Link> ); };
2. Auth配置文件(@/lib/auth)
import { setCookie } from "@/helpers/setCookie"; import { NextAuthOptions } from "next-auth"; import NextAuth from "next-auth/next"; import CredentialsProvider from "next-auth/providers/credentials"; import GoogleProvider from "next-auth/providers/google"; import { cookies } from "next/headers"; export const authOptions: NextAuthOptions = { providers: [ CredentialsProvider({ name: "Credentials", credentials: { email: { label: "Email", type: "email", placeholder: "Email" }, password: { label: "Password", type: "password", placeholder: "Password", }, rememberMe: { label: "Remember Me", type: "checkbox", placeholder: "Remember Me", }, }, async authorize(credentials) { if (!credentials?.email || !credentials?.password) { return null; } try { const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/auth/login`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ ...credentials, rememberMe: credentials.rememberMe === "true" ? true : false, }), } ); const data = await res.json(); (await cookies()).set("token", data.token); if (data.error) { return { status: data?.status, error: data?.message }; } return data; } catch (error) { return error; } }, }), GoogleProvider({ clientId: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID as string, clientSecret: process.env .NEXT_PUBLIC_GOOGLE_CLIENT_SECRET as string, }), ], callbacks: { async jwt({ token, user, account, profile }) { if (account?.provider === "google" && account.access_token) { try { const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/auth/google-login`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ token: account.access_token, }), } ); const data = await res.json(); (await cookies()).set("token", data.token); if (res.ok && data?.token) { token.id = data.id; token.email = data.email; token.token = data.token; } else { throw new Error( "Failed to exchange Google token for backend JWT" ); } } catch (error) { console.error("Error exchanging Google token:", error); } } if (user) { token.id = user.id; token.email = user.email || ""; token.token = user.token; } return token; }, async signIn({ user }: any) { if (user?.error) { throw new Error(user?.error); } return true; }, async session({ session, token }) { if (token) { session.user.id = token.id!; session.user.email = token.email!; session.user.token = token.token; } return session; }, }, secret: process.env.NEXT_PUBLIC_NEXTAUTH_SECRET, jwt: { secret: process.env.NEXT_PUBLIC_NEXTAUTH_SECRET, }, session: { strategy: "jwt", }, pages: { signIn: "/login", }, };
3. NextAuth类型声明文件
import NextAuth, { DefaultSession, DefaultUser } from "next-auth"; import { JWT as NextAuthJWT } from "next-auth/jwt"; declare module "next-auth" { interface User extends DefaultUser { id: string; token?: string; } interface Session { user: { id: string; email: string; token?: string; } & DefaultSession["user"]; } } declare module "next-auth/jwt" { interface JWT extends NextAuthJWT { id: string; email: string; token?: string; } }
4. NextAuth API路由文件
import { authOptions } from "@/lib/auth"; import NextAuth from "next-auth/next"; const handler = NextAuth(authOptions); export { handler as GET, handler as POST };
错误截图


目前无法定位错误原因,恳请协助排查解决。
内容的提问来源于stack exchange,提问作者Danil Diachenko
相关产品推荐
相关产品推荐

