使用next-auth/discord的session回调无法添加user.id至会话
解决NextAuth Discord验证中无法将user.id加入会话的问题
你的代码存在两个关键问题,导致user.id无法成功添加到会话对象中:
1. 配置结构错误
你把session和callbacks配置放在了DiscordProvider的参数里,这是错误的。这两个配置项属于NextAuth的顶层配置,应该和providers同级。
2. JWT策略下的参数差异
当使用jwt会话策略时,session回调中的user参数是undefined的——因为此时会话数据是从JWT令牌中读取的,而非直接从数据库或用户对象获取。你需要先在jwt回调中将用户ID存入令牌,再在session回调中从令牌取出并添加到会话对象。
修正后的[...nextauth].js代码
import NextAuth from "next-auth/next"; import DiscordProvider from "next-auth/providers/discord"; export default NextAuth({ providers: [ DiscordProvider({ clientId: process.env.DISCORD_CLIENT_ID, clientSecret: process.env.DISCORD_CLIENT_SECRET, // Discord Provider的其他配置,比如scope等 }) ], // 顶层session配置 session: { strategy: "jwt", // 其他session配置项 }, // 顶层callbacks配置 callbacks: { // 先在jwt回调中把user.id存入token async jwt({ token, user }) { // 只有首次登录时user才存在 if (user) { token.id = user.id; } return token; }, // 再从token中取出id添加到session async session({ session, token }) { if (session.user) { session.user.id = token.id; } return session; } } });
验证修正效果
你的/api/page.js代码不需要修改,运行后再次打印session,就能看到user对象中包含id属性了:
{ user: { name: "...", email: "...", image: "...", id: "你的Discord用户ID" }, expires: "..." }
内容的提问来源于stack exchange,提问作者Finbar
相关产品推荐
相关产品推荐

