Discord Oauth2 收到“无效客户端”错误

Posted

技术标签:

【中文标题】Discord Oauth2 收到“无效客户端”错误【英文标题】:Discord Oauth2 receiving 'invalid client' error 【发布时间】:2019-08-18 20:07:35 【问题描述】:

我实施了 Discord Oauth2,以便我的用户可以通过 Discord 进行身份验证来登录我的网站。几个月来,一切都很好,但现在突然停止工作了。

根据 Discord 的 oauth2 指令https://discordapp.com/developers/docs/topics/oauth2#shared-resources,我能够成功获取用于交易访问令牌的访问代码。但是,当我尝试接收访问令牌时,我收到“invalid_client”错误。

首先,我要达到这个终点:

https://discordapp.com/api/oauth2/authorize?client_id=$process.env.CLIENT_ID&redirect_uri=http%3A%2F%2Flocalhost%3A5000%2Flogin%2Fdiscord%2Fcallback&response_type=code&scope=identify%20email%20gdm.join

成功返回以下内容:

http://localhost:5000/login/discord/callback?code=some_access_code

然后将访问代码发送回 discord 以获取访问令牌。这是失败的代码:

export function getDiscordAccessToken(accessCode, call) 
  const redirect = call === 'login' ? process.env.DISCORD_LOGIN_REDIRECT : process.env.DISCORD_CONNECT_REDIRECT


  return new Promise((resolve, reject) => 

    axios
      .post(
        `https://discordapp.com/api/oauth2/token?client_id=$process.env.DISCORD_CLIENTID&client_secret=$process.env.DISCORD_SECRET&grant_type=authorization_code&code=$accessCode&redirect_uri=$redirect&scope=identify%20email%20gdm.join`
    )
      .then(res => 
        resolve(res.data)
      )
      .catch(err => 
        // log error to db
        console.log("Here is your error: ", err.response)
        reject(err.response)
      )
  )

这段代码运行了几个月,没有任何问题。然后,它突然停止工作。我什至检查了可在此处找到的 Discord 更改日志,https://discordapp.com/developers/docs/change-log,但我发现没有提及身份验证更改。

非常感谢您提供的任何帮助!

【问题讨论】:

【参考方案1】:

查询参数应该在 POST 请求的 BODY 中,而不是 oauth/token url 的 URL。

Discord 最近对 oAuth2 进行了更新,使其更符合标准。这意味着它们不再支持 POST 的 URL 中的参数,而是要求它们在正文和表单编码中(基本相同,但在正文中并且没有前导 ?)。

所以你基本上需要(未测试):

 axios
      .post(
        "https://discordapp.com/api/oauth2/token",       
        "client_id=$process.env.DISCORD_CLIENTID&client_secret=$process.env.DISCORD_SECRET&grant_type=client_credentials&code=$accessCode&redirect_uri=$redirect&scope=identify%20email%20gdm.join"
       )

【讨论】:

成功了!我认为 Discord 改变了一些东西……你只是为我节省了大量浪费的时间。仅供参考,我唯一不同的是添加一个配置对象,其标头设置为 application/x-www-form-urlencoded【参考方案2】:

我知道问题已经得到解答,但就我而言,我复制了错误的密钥。请确保您复制的是正确的。

Secret Key 位于 OAuth2 选项卡下,而不是 Discord 开发人员仪表板的常规信息选项卡下。

【讨论】:

我犯了同样的错误。谢谢提示!

以上是关于Discord Oauth2 收到“无效客户端”错误的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 oauth2 从 Discord API 获取信息

如何安全地存储 Discord(OAuth2) 用户的访问令牌?

Discord Oauth2 PHP 中的 JPEG 头像

Discord OAuth2 冻结

如何撤销 Discord OAuth2.0 中的令牌?