如何让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
相关产品推荐
相关产品推荐

