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" 响应的主要内容,如果未能解决你的问题,请参考以下文章
discord oauth2 api 调用返回“405:不允许的方法”