代码之家  ›  专栏  ›  技术社区  ›  slothiful

Discord API-传递回生成的OAuth2代码的随机“无效代码”错误

  •  0
  • slothiful  · 技术社区  · 6 年前

    我已经使用授权码授权类型在我的应用程序中成功实现了Discord的OAuth2流。最终用户导航到我的机器人程序的Discord的OAuth2链接,授权其访问,Discord使用 code querystring。机器人程序然后通过查询Discord的API将此代码交换为访问令牌。有关此过程的文档可用 here 以供参考。

    然而, 大约每50到100个对交换端点的请求中,我都会收到一个403错误 invalid_grant 以及描述 Invalid "code" in request. 坦率地说,我不明白Discord系统刚刚提供的代码是如何立即无效的。同一用户可以再次完成该过程,并且第二次不会返回错误。

    出于绝望,我尝试在开发人员仪表板中切换名为 Requires OAuth2 Code Grant 看到它说“如果你的应用程序需要多个作用域”,但它没有效果。我也尝试过无休止的调试,但每次发生的情况显然都是随机的。奇怪的是,我在网上找不到任何有同样问题的人。

    下面是我在Node.js中使用 superagent 图书馆。它与文档相匹配,并且工作完美,除了随机响应是所描述的错误。

    superagent.post('https://discordapp.com/api/v6/oauth2/token')
      .type('x-www-form-urlencoded')
      .set('Content-Type', 'application/x-www-form-urlencoded')
      .send({
        client_id: process.env.BOT_ID,
        client_secret: process.env.BOT_SECRET,
        grant_type: 'authorization_code',
        code,
        redirect_uri: process.env.OAUTH2_REDIRECT_URI,
        scope: 'identify guilds.join',
      });
    

    我可以确认所有变量都符合其预期值。价值 redirect_uri 匹配 redirect_uri 在使用的原始URL中。 代码 是的值 代码 通过OAuth2流返回的查询字符串。

    我做错了什么(如果有的话)导致了错误?


    更新1:

    Discord已将我引导到API GitHub回购,我发现问题已解决 here 。已发表评论,如果我收到任何有用的信息或完全解决问题(希望情况如此),我将在此处更新。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Silver Dragon    3 年前

    使用nodejs也遇到了同样的问题。在这里留下繁荣的笔记:

    • 在Node上,如果没有显式的app.head()处理器,.post()处理器将接收所有head请求
    • 几部Android手机在从不和谐状态重定向后,首先向端点发送头部请求

    含义:

    • 用户在不一致时进行身份验证,然后通过重定向返回,进行头部请求。这会与代码产生冲突,但之后它还会直接发出一个post请求,这将失败(因为你已经使用过一次代码),并可能取消用户的身份验证。

    针对我的特定问题的解决方案是为所有回调端点提供一个显式的.head处理程序,它基本上只返回与post相同的标头(重定向),但没有调用discord。

    希望这能有所帮助。

        2
  •  0
  •   Joe Moore    6 年前

    您是否使用OAuth2链接以正确的权限邀请您的机器人到您的服务器?如果是这样,你在main.js文件中定义了令牌吗? 即机器人登录(YOUR_TOKEN_HERE) 我建议不要切换Requires OAuth2代码授权,因为一开始做任何事情都很痛苦。 请告诉我任何进展:)

    推荐文章