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

使用Discord API调用guilds.join时遭遇Invalid OAuth2 Access Token错误

使用Discord API的guilds.join scope让用户加入服务器时返回Invalid OAuth2 access token错误

我正在用Node.js和Discord API开发Discord机器人,目标是通过guilds.join scope让用户加入指定服务器。以下是获取用户身份并执行加入操作的代码:

private async joinUserDiscordServer(accessData: any) {
    console.log(accessData) // #1

    const data = {
      access_token: `Bearer ${accessData.access_token}`,
    };
    const options: AxiosRequestConfig = {
      headers: { Authorization: `Bot ${process.env.DISCORD_TOKEN}`, setContentType: 'application/json' },
    };

    try {
      const userInfo = await firstValueFrom(
        this.httpService.get('https://discord.com/api/v10/users/@me', { headers: { Authorization: `Bearer ${accessData.access_token}` } })
      );

      console.log(userInfo.dta); // #2
      
      const result = await firstValueFrom(
        this.httpService.put(`https://discord.com/api/v10/guilds/${process.env.DISCORD_SERVER_ID}/members/${userInfo.data.id}`, data, options)
      );
    } catch (e) {
      console.log(e); // #3
      throw new HttpException(e, HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }

#1 输出的accessData:

{
  token_type: 'Bearer',
  access_token: 'xxxxxxxxxxxxxxxxxxxxxxxxx',
  expires_in: 604800,
  refresh_token: 'xxxxxxxxxxxxxxxxxxxxxxxxx',
  scope: 'email guilds guilds.join identify'
}

#2 输出的用户信息:

{
    id: 'xxxxxxxx',
    username: 'xxxxxxxx',
    avatar: 'xxxxxxxx',
    discriminator: '0',
    public_flags: 0,
    premium_type: 2,
    flags: 0,
    banner: 'xxxxxxxx',
    accent_color: 72262,
    global_name: 'xxxxxxxx',
    avatar_decoration_data: null,
    banner_color: '#011a46',
    mfa_enabled: true,
    locale: 'de',
    email: 'xxxxxxxx',
    verified: true
}

#3 捕获到的错误:

data: { message: 'Invalid OAuth2 access token', code: 50025 }

我已经做了以下排查:

  • 机器人已加入目标服务器
  • 获取access token和执行加入操作使用的是同一个Discord应用
  • 机器人拥有对应权限(权限错误会返回不同提示)
  • Bot Token正确(Token错误会返回其他提示)

请问我哪里操作出错了?


问题解决

核心错误是请求体中的access_token格式错误:

调用PUT /guilds/{guild.id}/members/{user.id}接口时,请求体里的access_token只需要传入纯token字符串,不需要添加Bearer 前缀。你当前代码给access_token赋值了Bearer ${accessData.access_token},导致Discord无法识别这个token,直接返回50025错误。

另外还有两个小问题需要修正:

  1. 打印用户信息时的笔误:console.log(userInfo.dta);应该改为console.log(userInfo.data);,否则日志会输出undefined
  2. 请求头字段名错误:setContentType应该是标准的Content-Type,虽然Axios可能自动处理JSON请求的头信息,但规范写法需要修正

修正后的代码片段:

private async joinUserDiscordServer(accessData: any) {
    console.log(accessData) // #1

    // 去掉Bearer前缀,只传纯token字符串
    const data = {
      access_token: accessData.access_token,
    };
    const options: AxiosRequestConfig = {
      headers: { 
        Authorization: `Bot ${process.env.DISCORD_TOKEN}`,
        'Content-Type': 'application/json' // 修正header字段名
      },
    };

    try {
      const userInfo = await firstValueFrom(
        this.httpService.get('https://discord.com/api/v10/users/@me', { headers: { Authorization: `Bearer ${accessData.access_token}` } })
      );

      console.log(userInfo.data); // 修正笔误
      
      const result = await firstValueFrom(
        this.httpService.put(`https://discord.com/api/v10/guilds/${process.env.DISCORD_SERVER_ID}/members/${userInfo.data.id}`, data, options)
      );
    } catch (e) {
      console.log(e); // #3
      throw new HttpException(e, HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }

内容的提问来源于stack exchange,提问作者TimMatten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:22:18