NextAuth v5 Credentials验证返回null,用户对象却为有效对象
NextAuth Credentials验证后Session返回null问题
我使用最新版本的NextAuth开发认证应用,在Credentials验证的authorize流程中,从数据库获取到有效用户对象后,返回至Session时却得到null值,尝试强制传入数据也无法解决问题。
相关配置代码
auth.config.ts
import bcrypt from "bcryptjs" import type { NextAuthConfig } from "next-auth" import Credentials from "next-auth/providers/credentials" import { LoginSchema } from "@/utils/schemas/index" import getUserByEmail, { } from "@/database/getUserByEmail" export default { providers: [ Credentials({ async authorize(credentials): Promise<any> { const validatedFields = LoginSchema.safeParse(credentials) if (validatedFields.success) { const { email, password } = validatedFields.data const user = await getUserByEmail(email) if (!user || !user.Senha) return null const passwordsMatch = await bcrypt.compare( password, user.Senha, ) if (passwordsMatch) { console.log(typeof user) // 输出为有效对象 return user } } return null } }) ], } satisfies NextAuthConfig
auth.ts
import NextAuth from "next-auth" import authConfig from "./auth.config" import { db } from "@/database/db" import { PrismaAdapter } from "@auth/prisma-adapter" export const { handlers: { GET, POST }, auth, signIn, signOut, } = NextAuth({ adapter: PrismaAdapter(db), session: { strategy: "jwt" }, ...authConfig, })
依赖版本

问题原因及解决方法
JWT模式需手动映射用户数据
当会话策略设为jwt时,NextAuth不会自动把authorize返回的用户对象同步到Session,必须通过jwt和session回调手动处理字段映射。用户字段不匹配导致Session为空
NextAuth默认识别id、email等标准字段,若数据库返回的用户对象字段命名不统一,需在回调中做转换,或在authorize阶段返回标准化字段。
修改后的配置示例
在auth.config.ts中添加回调配置:
export default { providers: [/* 原Credentials配置 */], callbacks: { async jwt({ token, user }) { // 登录时将用户数据合并到JWT Token if (user) { token.id = user.id // 替换为你的用户ID字段名 token.email = user.email // 按需添加其他需要的用户字段 } return token }, async session({ session, token }) { // 将Token中的数据映射到Session对象 if (token) { session.user.id = token.id session.user.email = token.email } return session } } } satisfies NextAuthConfig
额外检查点
- 确认
getUserByEmail返回的用户对象包含唯一标识字段(如id),这是NextAuth关联会话的必要条件。 - 检查Prisma用户模型是否符合NextAuth要求,确保包含
email、id等基础字段。 - 排查是否有中间件或权限逻辑拦截了Session数据,导致返回null。
内容的提问来源于stack exchange,提问作者Bruno Bispo
相关产品推荐
相关产品推荐

