请求 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=> {
        // ...
     })