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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:24:52