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

时间:2019-03-28 06:02:53

标签: oauth-2.0 discord

我实施了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)
      })
  })
}

此代码运行了几个月没有出现问题。然后,突然间它停止工作了。我什至查看了https://discordapp.com/developers/docs/change-log上的Discord更改日志,但没有找到对身份验证更改的引用。

非常感谢您提供的帮助!

1 个答案:

答案 0 :(得分:2)

查询参数应位于POST请求的正文中,而不是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"
       )