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

无法将自定义后端数据附加到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:43:19