【问题标题】:OAuth2: Discord API always responds with {"error": "invalid_grant"}OAuth2:Discord API 总是以 {"error": "invalid_grant"} 响应
【发布时间】:2020-10-07 13:30:15
【问题描述】:

我正在尝试在我的 node.js 应用程序中实现 Discord OAuth2。一旦我尝试从给定的授权代码中获取访问令牌,我总是会收到 HTTP 响应 Error 400 {"error": "invalid_grant"}

let xhr = new XMLHttpRequest()
xhr.open('POST', 'https://discord.com/api/oauth2/token')

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

let payload ={
    client_id: clientID,
    client_secret: clientSecret,
    grant_type: 'authorization_code',
    code: code,
    redirect_uri: redirectUrl,
    scope: 'identify'
};

console.log(payload)
xhr.send(JSON.stringify(payload))

xhr.onreadystatechange = () => {
    console.log(xhr.status)
    console.log(xhr.responseText)
}

xhr.onerror = () => {
    console.log('Failed')
}

【问题讨论】:

    标签: javascript node.js http oauth discord


    【解决方案1】:

    好的,我解决了这个问题。对于遇到与我相同的问题的每个人,我通过使用 axios 和 querystring 将 POST 请求发送到 Discord API (https://github.com/discord/discord-api-docs/issues/1131) 来解决它

    好像是json和x-www-form-urlencoded格式有问题。

    【讨论】:

      【解决方案2】:

      payload 不应该是一个 js 对象,而是一个表单数据,即

      let payload = new FormData();
      payload.append("key in string","value in string")
      

      【讨论】:

      • 并将内容类型更改为 multipart/form-data
      【解决方案3】:

      我在尝试使用 Next.js 的 GetServerSideProps 函数时遇到了同样的问题。

      经过大量搜索,我在 Github 上发现了一个已解决的问题,解决了这个问题 (Github Issue: Deep Linking with OAuth2 Not Working)。基本上,我们不能在身份验证请求的主体上使用 JSON 对象。我们必须改用URLSearchParams 对象。

      有效负载应如下所示:

      const payload = new URLSearchParams()
      
      payload.append('client_id', process.env.DISCORD_CLIENT_ID)
      payload.append('client_secret', process.env.DISCORD_CLIENT_SECRET)
      payload.append('grant_type', 'authorization_code')
      payload.append('redirect_uri', process.env.DISCORD_REDIRECT_URI)
      payload.append('code', accessCode)
      payload.append('scope', 'identify')
      

      【讨论】:

        【解决方案4】:

        就我而言,这是一个非常愚蠢的错误。 我发送的不是“response_type”,而是“response_type”(带空格);当我打印 HTML 格式的字符串并看到一个 %20 时,我随机意识到 确保参数名称正确!

        【讨论】:

          猜你喜欢
          • 2018-11-02
          • 2014-11-28
          • 2018-09-09
          • 2015-09-17
          • 1970-01-01
          • 2014-06-28
          • 2021-04-11
          • 2021-12-03
          • 1970-01-01
          相关资源
          最近更新 更多