OAuth2:Discord API 总是以 "error": "invalid_grant" 响应

Posted

技术标签:

【中文标题】OAuth2:Discord API 总是以 "error": "invalid_grant" 响应【英文标题】: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')

【问题讨论】:

【参考方案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 时,我随机意识到 确保参数名称正确!

【讨论】:

以上是关于OAuth2:Discord API 总是以 "error": "invalid_grant" 响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 oauth2 从 Discord API 获取信息

discord oauth2 api 调用返回“405:不允许的方法”

向 Discord API 发送 OAuth2 请求时的 invalid_client

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

Discord Oauth2 访问令牌“不支持授予类型无”

尝试使用 Discord 的 oauth2 时出现“invalid_grant”错误