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

如何让NextAuth的Session回调仅在GoogleProvider登录时执行POST请求?

解决方案

要实现仅在GoogleProvider登录时执行session回调中的POST请求,核心是在token中记录登录所用的Provider类型,再在session回调中根据该类型判断是否执行请求。具体实现如下:

1. 在jwt回调中保存Provider标识

用户登录时,account对象会携带当前登录使用的Provider标识(Google登录为google,Credentials登录为credentials)。我们需要将这个标识存入token,供后续session回调判断:

async jwt({token, account}) {
  if (account) {
    token = Object.assign({}, token, { 
      access_token: account.access_token, 
      id_token: account.id_token,  
      refresh_token: account.refresh_token,
      provider: account.provider // 新增:保存Provider类型到token
    });
  }
  return token
},

2. 在session回调中判断Provider并执行请求

在session回调里,先检查token中的provider是否为google,只有符合条件时才执行POST请求:

async session({session, token}) {
  if(session) {
    session = Object.assign({}, session, {
      access_token: token.access_token, 
      id_token: token.id_token,
      provider: token.provider // 可选:将Provider信息同步到session,方便前端使用
    })
    
    // 仅Google登录时执行POST请求
    if (token.provider === 'google') {
      try {
        const apiKey = process.env.API_KEY
        const response = await axios.post(
          process.env.GOOGLE_API,
          { authorizationCode: token.id_token, apiKey: apiKey },
          {
            headers: {
              "Content-Type": "application/json",
            },
          }
        );
        const userData = response.data;
        // 可选:将返回的用户数据同步到session中
        // session.user = {...session.user, ...userData}
      } catch (error) {
        console.error("Failed:", error);
      }
    }
  }
  return session
},

修改后的完整代码

const handler = NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID?? '',
      clientSecret: process.env.GOOGLE_CLIENT_SECRET?? ''
    }),
    CredentialsProvider({
      name : "Credentials",
      async authorize(credentials, req){
        try {
          const response = await axios.post(
            process.env.API_ROUTE,
            { email: credentials.email, password:  credentials.password, apiKey:  process.env.API_KEY },
            {
              headers: {
                "Content-Type": "application/json",
              },
            }
          );
          const userData = response.data;
          return { success: true };
        } catch (error) {
          console.error("Login failed:", error);
          return { success: false };
        }
      }
  })
  ],
  callbacks: {
    async jwt({token, account}) {
      if (account) {
        token = Object.assign({}, token, { 
          access_token: account.access_token, 
          id_token: account.id_token,  
          refresh_token: account.refresh_token,
          provider: account.provider // 新增保存Provider类型
        });
      }
      return token
    },
    async session({session, token}) {
      if(session) {
        session = Object.assign({}, session, {
          access_token: token.access_token, 
          id_token: token.id_token,
          provider: token.provider // 可选同步到session
        })
        
        // 仅Google登录时执行请求
        if (token.provider === 'google') {
          try {
            const apiKey = process.env.API_KEY
            const response = await axios.post(
              process.env.GOOGLE_API,
              { authorizationCode: token.id_token, apiKey: apiKey },
              {
                headers: {
                  "Content-Type": "application/json",
                },
              }
            );
            const userData = response.data;
          } catch (error) {
            console.error("Failed:", error);
          }
        }
      }
      return session
    },
  }
})

export {handler as GET, handler as POST};

修改完成后,CredentialsProvider登录时不会触发session回调中的POST请求,仅GoogleProvider登录时才会执行该请求。

内容的提问来源于stack exchange,提问作者Sahil Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:15:35