如何在Next-Auth的session.user中添加自定义字段?
解决Next-Auth自定义session.user字段不生效的问题
你的问题核心在于使用JWT会话策略时,NextAuth不会自动将authorize返回的所有自定义字段同步到session中,默认仅识别id、name、email这类预设字段。要让userId和companyId出现在session里,必须通过jwt和session两个回调函数手动处理字段同步。
修改后的完整代码
import NextAuth from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; import axios from "axios"; const handler = NextAuth({ providers: [ CredentialsProvider({ name: "Credentials", credentials: { email: { label: "Email", type: "email", placeholder: "Enter your email", }, password: { label: "Password", type: "password" }, }, async authorize(credentials, req) { const res = await axios({ method: "POST", url: `${process.env.NEXT_PUBLIC_AUTH_URL}/api`, data: { query: ` query Login($email: String!, $password: String!) { login(email: $email, password: $password) { userId token tokenExpiration companyId } } `, variables: { email: credentials.email, password: credentials.password, }, }, }); // Validation if (res.data.errors) { throw new Error(res.data.errors[0].message); } const user = { userId: res.data.data.login.userId, companyId: res.data.data.login.companyId, }; if (user) { return user; } return null; }, }), ], session: { strategy: "jwt", }, // 添加这两个回调函数 callbacks: { async jwt({ token, user }) { // 用户登录时,将自定义字段添加到token中 if (user) { token.userId = user.userId; token.companyId = user.companyId; } return token; }, async session({ session, token }) { // 将token中的自定义字段同步到session.user if (session.user) { session.user.userId = token.userId; session.user.companyId = token.companyId; } return session; }, }, pages: { signIn: "/login", signOut: "/logout", }, secret: process.env.NEXTAUTH_SECRET, }); export { handler as GET, handler as POST };
关键说明
jwt回调:在用户首次登录时,user参数会携带authorize返回的对象,我们把userId和companyId附加到JWT token里。后续每次请求都会携带这个token,回调会持续保留这些字段。session回调:每次前端通过useSession获取会话时,这个回调会把JWT token里的自定义字段映射到session.user中,这样前端就能直接访问到session.user.userId和session.user.companyId了。
验证方法
修改后重新启动项目,登录成功后在page.jsx中打印useSession返回的session对象,就能看到自定义字段已经出现在user里了。
内容的提问来源于stack exchange,提问作者PugProvoleta
相关产品推荐
相关产品推荐

