在NextJS 15中使用Auth.js通过X认证时获取用户数字ID
问题背景
我在NextJS 15项目里用Auth.js做X(原Twitter)的登录认证,当前src/auth.ts的配置代码如下:
import NextAuth from "next-auth" import Twitter from "next-auth/providers/twitter" // Initialize NextAuth with configuration export const { handlers, auth, signIn, signOut } = NextAuth({ providers: [ // Set up Twitter authentication provider Twitter, ], callbacks: { // Callback function to log the session object after authentication async session({ session, token }) { console.log("Twitter session object:", session) // Log the session object return session }, // Callback function to check if the user is authorized (logged in) authorized: async ({ auth }) => { // Return true if authenticated, otherwise redirect to the login page return !!auth }, }, // Custom sign-in page configuration pages: { signIn: "/login", // Custom login page path }, })
但认证后打印的session对象里只有这些内容,看不到X的19位数字用户ID:
Twitter session object: { user: { name: 'Some Name', email: undefined, image: 'https://pbs.twimg.com/profile_images/1234_normal.jpg' }, expires: '2025-01-18T06:41:23.092Z' }
我不需要用户邮箱,但必须拿到这个数字ID——有没有办法在认证的时候直接获取?如果不行的话有什么替代方案?另外没有这个唯一标识的话,怎么把用户信息存进数据库?后续要代用户发内容的时候,又怎么识别对应的账号?
解决方案
1. 直接获取X用户ID的方法
Auth.js的X认证插件在完成认证时,会把X返回的原始用户数据传到jwt回调的profile参数里,其中就包含19位数字ID。你只需要修改配置,在jwt回调里把这个ID存到token里,再同步到session中就行:
修改src/auth.ts的配置,调整jwt和session回调,同时给X provider加上必要的权限:
import NextAuth from "next-auth" import Twitter from "next-auth/providers/twitter" export const { handlers, auth, signIn, signOut } = NextAuth({ providers: [ Twitter({ // 配置权限,确保能获取用户基础信息和发推权限(按需调整) authorization: { params: { scope: "users.read tweet.write", }, }, }), ], callbacks: { async jwt({ token, profile }) { // 认证成功后,profile里是X返回的完整用户数据 if (profile) { // X的数字ID就在profile.id字段里 token.twitterId = profile.id; // 顺便把accessToken存下来,后续调用X API要用 token.accessToken = profile.access_token; } return token; }, async session({ session, token }) { // 把token里的twitterId同步到session,方便前端或后端使用 if (session.user) { session.user.twitterId = token.twitterId as string; } console.log("Updated session object:", session); return session; }, authorized: async ({ auth }) => { return !!auth; }, }, pages: { signIn: "/login", }, })
改完之后,session里就会带上twitterId字段,不管是存数据库还是后续调用API都能用。
2. 数据库存储与代发内容的逻辑
- 存数据库:用户第一次认证成功时,用
twitterId作为唯一标识,把用户名、头像、这个ID一起存进数据库。如果是老用户,直接用这个ID匹配关联就行,不会出现重复或混淆。 - 代用户发内容:刚才存在token里的
accessToken是X API的授权凭证,发内容的时候,从token里取出accessToken和twitterId,调用X的发推API(比如POST /2/tweets),用accessToken做身份验证,就能确保内容是从该用户的账号发出的,twitterId则用来确认你操作的是正确的用户。
3. 替代方案(如果直接拿不到ID)
要是因为API版本或者权限问题,profile里没有id字段,你可以这么办:
- 调用X的用户信息API:用认证后的
accessToken调用GET /2/users/me接口,这个接口会返回包含用户ID的完整信息,你可以在认证完成后发起这个请求,把ID存到数据库和session里。 - 用Auth.js的
user回调:在user回调里处理原始的profile数据,提取ID并返回,之后再同步到token和session中。
内容的提问来源于stack exchange,提问作者Ubiquitous Ubuntu
相关产品推荐
相关产品推荐

