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

NextJS CredentialsProvider仅返回{email},如何获取完整用户信息?

解决NextAuth中session.user仅返回email的问题

直接给你修改后的完整代码,核心是通过callbacks自定义JWT和Session的字段映射:

import NextAuth from 'next-auth'
import CredentialsProvider from 'next-auth/providers/credentials'
import { compare } from 'bcryptjs'

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()

export const authOptions = {
    secret: process.env.NEXTAUTH_SECRET,
    // 明确指定session策略为JWT(CredentialsProvider默认用这个,但写上更清晰)
    session: {
        strategy: 'jwt'
    },
    providers: [
        CredentialsProvider({
            type: 'credentials',
            async authorize(credentials, req) {
                const dbUser = await prisma.users.findUnique({
                    where: {
                        email: credentials.email,
                    },
                })
                if (!dbUser) return null
                const checkPassword = await compare(credentials.password, dbUser.password)
                if (!checkPassword) throw new Error('Invalid credentials')
                // 返回完整用户信息,后续会传给jwt回调
                return dbUser
            },
        }),
    ],
    // 核心配置:自定义token和session内容
    callbacks: {
        // 生成/更新JWT时,把需要的用户字段加入token
        async jwt({ token, user }) {
            // user仅在首次登录时存在,此时将dbUser的字段合并到token
            if (user) {
                token.id = user.id
                token.name = user.name // 替换成你用户表实际有的字段,比如username
                token.role = user.role // 比如用户角色,按需添加
                // 其他需要的字段都可以在这里追加
            }
            return token
        },
        // 生成前端可用的session时,把token里的字段映射到session.user
        async session({ session, token }) {
            if (session.user) {
                session.user.id = token.id
                session.user.name = token.name
                session.user.role = token.role
                // 对应上面jwt回调里添加的字段
            }
            return session
        }
    },
    pages: {
        signIn: '/connexion',
    },
}

export default NextAuth(authOptions)

关键说明

  • NextAuth默认只会把email、name、image这类标准字段放到session里,自定义字段必须通过callbacks手动配置。
  • jwt回调负责把你需要的用户数据存入JWT令牌中,session回调再把这些数据从令牌里取出来,挂载到session.user上。
  • 不要把敏感字段(比如密码)加入token或session,你的代码里已经避免了这一点,没问题。
  • 要根据你实际的用户表结构调整字段,比如你的dbUser里有username、avatarUrl等,就对应加到jwt和session回调里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:25:44