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
相关产品推荐
相关产品推荐

