NextAuth集成Discord登录无法获取用户access token问题求助
问题定位
你的配置存在2个核心错误,导致回调逻辑完全不生效、字段取值错误:
- 配置层级错误:
callbacks、secret是NextAuth初始化的根级配置项,你错误将其写在了DiscordProvider的入参配置内部。NextAuth只会读取Provider下和OAuth厂商对接相关的配置(clientId、clientSecret、authorization这类),Provider内部写的callbacks、secret完全不会被加载,你定义的jwt、session回调根本没有注册到NextAuth的执行流程里,自然不会执行打印逻辑。 - 字段名不匹配:就算回调正常执行,你在jwt回调里给token赋值的字段是
accessToken,session回调里读取的却是token.access_token,字段名拼写不一致会直接取到undefined。
修正后完整配置
把callbacks、secret移动到和providers数组同级的根配置位置,同时修正字段名匹配问题:
import NextAuth from 'next-auth/next'; import DiscordProvider from 'next-auth/providers/discord'; export default NextAuth({ secret: process.env.NEXTAUTH_SECRET, providers: [ DiscordProvider({ clientId: process.env.DISCORD_CLIENT_ID, clientSecret: process.env.DISCORD_CLIENT_SECRET, callbackUrl : process.env.NEXTAUTH_URL, authorization: { params: { scope: 'identify email guilds applications.commands.permissions.update' } } }), ], callbacks: { async jwt({ token, account }){ if (account) { token.accessToken = account.access_token } return token; }, async session({ session, token }) { session.accessToken = token.accessToken console.log(session.accessToken); return session; } }, })
前端取值调整
你之前的前端代码只打印了session.user,accessToken是直接挂载在session根对象下的,不属于user字段,调整打印逻辑即可看到结果:
const { data: session, status } = useSession(); const user = session?.user; console.log('用户信息:', user); console.log('accessToken:', session?.accessToken);
注意事项
- 修改
[...nextauth].js配置后必须重启Next开发服务,新的配置才会生效 - Discord开发者后台配置的重定向URI必须和服务端回调地址完全匹配,标准格式为
${你的域名}/api/auth/callback/discord - 确保所有环境变量(DISCORD_CLIENT_ID、DISCORD_CLIENT_SECRET、NEXTAUTH_URL、NEXTAUTH_SECRET)都已正确注入到服务端运行环境
内容的提问来源于stack exchange,提问作者Aditya Kirad
相关产品推荐
相关产品推荐

