NextAuth会话未返回自定义添加的键值对,是否无法自定义会话字段?
NextAuth 会话添加自定义字段问题解决
不是无法添加自定义字段,而是你缺少了会话回调的配置。NextAuth 默认只会将标准用户字段(如name、email、image)纳入会话,自定义字段需要手动通过callbacks配置传递。
解决步骤:
- 在你的 NextAuth 配置文件(通常是
pages/api/auth/[...nextauth].js/.ts)中添加callbacks选项,分别在jwt和session回调中处理自定义字段:jwt回调:将自定义字段存入 JWT Token,因为会话数据最终来自 Token;session回调:从 Token 中取出自定义字段,添加到返回的会话对象中。
修改后的完整配置示例:
import NextAuth from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; import bcryptjs from "bcryptjs"; import db from "../../../utils/db"; import User from "../../../models/User"; export default NextAuth({ providers: [ CredentialsProvider({ async authorize(credentials) { await db.connect(); const user = await User.findOne({ email: credentials.email, }); await db.disconnect(); if (user && bcryptjs.compareSync(credentials.password, user.password)) { return { _id: user._id, name: user.name, email: user.email, image: 'f', sample: 'someValue', isAdmin: user.isAdmin, }; } throw new Error('Invalid email or password'); }, }), ], callbacks: { async jwt({ token, user }) { // 当用户首次登录时,user对象包含authorize返回的所有数据 if (user) { token._id = user._id; token.isAdmin = user.isAdmin; token.sample = user.sample; } return token; }, async session({ session, token }) { // 将Token中的自定义字段映射到会话对象 session.user._id = token._id; session.user.isAdmin = token.isAdmin; session.user.sample = token.sample; return session; }, }, // 会话策略默认是jwt,显式声明更清晰 session: { strategy: "jwt", }, });
配置完成后,你再打印会话对象时,sample字段就会正常显示在session.user中了。
内容的提问来源于stack exchange,提问作者CodeEx
相关产品推荐
相关产品推荐

