请求 Discord Oauth2 中的 redirect_uri 无效
Invalid redirect_uri in request Discord Oauth2
我看了其他和我一样的问题,例如this one or 。但问题是因为使用的 URI 不在 Discord OAuth2 配置中的重定向 URI 中,我检查了几次。
我有以下代码:
import querySring from 'query-string'
// I'm using React Router for this
const code = searchParams.get('code')
if (!code) return
const data = {
'client_id': 'my client id',
'client_secret': 'my client secret',
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': querySring.stringifyUrl({ url: 'http://localhost:3000/login/callback' }),
}
const strData = querySring.stringify(data)
const headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
fetch('https://discord.com/api/oauth2/token', {
method: 'POST',
headers,
body: strData,
})
.then(res => res.json())
.then(console.log)
我收到以下错误:
error: "invalid_request",
error_description: "Invalid \"redirect_uri\" in request."
当然,我确保在 Discord 开发者门户中有这个重定向 uri:
我也试过使用:
const data = {
// ...
'redirect_uri': 'http://localhost:3000/login/callback'
}
但是没有,我找不到问题所在。
正如 space 在 Discord API Server 中告诉我的那样,如果我从前端处理登录,我应该使用 response_type=token
而不是 response_type=code
那么我可以:
const token = searchParams.get('access_token')
const tokenType = searchParams.get('token_type')
/// For some reason the returned url is giving # instead of ? for query
if (window.location.toString().split('#').length > 1) {
window.location.replace(window.location.toString().replace('#', '?'))
}
if (!token || !tokenType) return console.log(`There is no token`)
const headers = {
authorization: `${tokenType} ${token}`
}
并使用这些 headers 来获取数据:
fetch('https://discord.com/api/users/@me', {
headers,
})
.then(res => res.json())
.then(user=> {
// ...
})
我看了其他和我一样的问题,例如this one or
我有以下代码:
import querySring from 'query-string'
// I'm using React Router for this
const code = searchParams.get('code')
if (!code) return
const data = {
'client_id': 'my client id',
'client_secret': 'my client secret',
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': querySring.stringifyUrl({ url: 'http://localhost:3000/login/callback' }),
}
const strData = querySring.stringify(data)
const headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
fetch('https://discord.com/api/oauth2/token', {
method: 'POST',
headers,
body: strData,
})
.then(res => res.json())
.then(console.log)
我收到以下错误:
error: "invalid_request",
error_description: "Invalid \"redirect_uri\" in request."
当然,我确保在 Discord 开发者门户中有这个重定向 uri:
我也试过使用:
const data = {
// ...
'redirect_uri': 'http://localhost:3000/login/callback'
}
但是没有,我找不到问题所在。
正如 space 在 Discord API Server 中告诉我的那样,如果我从前端处理登录,我应该使用 response_type=token
而不是 response_type=code
那么我可以:
const token = searchParams.get('access_token')
const tokenType = searchParams.get('token_type')
/// For some reason the returned url is giving # instead of ? for query
if (window.location.toString().split('#').length > 1) {
window.location.replace(window.location.toString().replace('#', '?'))
}
if (!token || !tokenType) return console.log(`There is no token`)
const headers = {
authorization: `${tokenType} ${token}`
}
并使用这些 headers 来获取数据:
fetch('https://discord.com/api/users/@me', {
headers,
})
.then(res => res.json())
.then(user=> {
// ...
})