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

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,
})

依赖版本

依赖版本信息


问题原因及解决方法

  1. JWT模式需手动映射用户数据
    当会话策略设为jwt时,NextAuth不会自动把authorize返回的用户对象同步到Session,必须通过jwt和session回调手动处理字段映射。

  2. 用户字段不匹配导致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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:43:17