使用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错误。
另外还有两个小问题需要修正:
- 打印用户信息时的笔误:
console.log(userInfo.dta);应该改为console.log(userInfo.data);,否则日志会输出undefined - 请求头字段名错误:
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
相关产品推荐
相关产品推荐

