无法将自定义后端数据附加到Next-auth用户对象的问题
解决NextAuth中signIn回调修改user无法传递到jwt回调的问题
问题原因
NextAuth的signIn回调中,你修改的user对象不会被传递到后续的jwt回调里。这是因为signIn回调的核心作用是判断是否允许用户登录(返回布尔值),而非修改用户数据并向下传递;同时jwt回调里的user参数仅在首次登录时会携带OAuth提供商返回的原始用户信息,并非signIn中修改后的对象。
解决方案
直接在jwt回调中完成API调用并附加自定义数据,这是最贴合NextAuth设计逻辑的方案:
import NextAuth from "next-auth"; import GitHubProvider from "next-auth/providers/github"; const options = { providers: [ GitHubProvider({ clientId: process.env.GITHUB_CLIENT_ID, clientSecret: process.env.GITHUB_CLIENT_SECRET, }), ], callbacks: { async signIn() { // 仅负责判断登录权限,无需处理API调用 return true; }, async redirect({ url, baseUrl }) { return baseUrl; }, async jwt({ token, user, account, profile }) { // 仅在首次登录时调用API(user参数存在时) if (user && account && profile) { try { const response = await fetch("http://localhost:9000/v1/users", { method: "POST", body: JSON.stringify({ user, profile, account, }), headers: { "Content-Type": "application/json", }, }); const apiData = await response.json(); // 将API返回的数据附加到token上 token.apiData = apiData; } catch (error) { console.error("Failed to save user information:", error); } } return token; }, async session({ session, token }) { // 将token中的自定义数据传递到前端可访问的session session.user.apiData = token.apiData; return session; }, }, }; export default (req, res) => NextAuth(req, res, options);
关键说明
jwt回调会在每次会话刷新时被调用,通过user参数的存在判断是否是首次登录,避免重复调用API。session回调的作用是把token里的自定义数据同步到前端能直接访问的session对象中,确保页面可以获取到API返回的令牌和用户信息。
内容的提问来源于stack exchange,提问作者airsoftFreak
相关产品推荐
相关产品推荐

