Discord Oauth2 получает ошибку «недопустимый клиент» - PullRequest
0 голосов
/ 28 марта 2019

Я реализовал Discord Oauth2, чтобы мои пользователи могли войти на мой сайт, пройдя аутентификацию через Discord. В течение нескольких месяцев все работало замечательно, а теперь внезапно перестало работать.

В соответствии с инструкциями Disca oauth2, https://discordapp.com/developers/docs/topics/oauth2#shared-resources, Я могу успешно получить код доступа, предназначенный для обмена на токен доступа. Однако, когда я пытаюсь получить токен доступа, я получаю ошибку «invalid_client».

Сначала я достигаю этой конечной точки:

https://discordapp.com/api/oauth2/authorize?client_id=${process.env.CLIENT_ID}&redirect_uri=http%3A%2F%2Flocalhost%3A5000%2Flogin%2Fdiscord%2Fcallback&response_type=code&scope=identify%20email%20gdm.join

, который успешно возвращает следующее:

http://localhost:5000/login/discord/callback?code={some_access_code}

Затем код доступа отправляется обратно на дискорд для получения токена доступа. Вот код, который не работает:

export function getDiscordAccessToken(accessCode, call) {
  const redirect = call === 'login' ? process.env.DISCORD_LOGIN_REDIRECT : process.env.DISCORD_CONNECT_REDIRECT


  return new Promise((resolve, reject) => {

    axios
      .post(
        `https://discordapp.com/api/oauth2/token?client_id=${process.env.DISCORD_CLIENTID}&client_secret=${process.env.DISCORD_SECRET}&grant_type=authorization_code&code=${accessCode}&redirect_uri=${redirect}&scope=identify%20email%20gdm.join`
    )
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        // log error to db
        console.log("Here is your error: ", err.response)
        reject(err.response)
      })
  })
}

Этот код работал месяцами без проблем. Затем внезапно он перестал работать. Я даже проверил журналы изменений Discord, которые можно найти здесь, https://discordapp.com/developers/docs/change-log,, но не нашел ссылки на изменения аутентификации.

Любая помощь, которую вы можете оказать, очень ценится!

1 Ответ

2 голосов
/ 28 марта 2019

Параметры запроса должны находиться в ТЕЛЕ POST-запроса, а не в URL-адресе oauth/token URL.

Discord недавно выпустил обновление для oAuth2, что делает его более стандартным. Это означает, что они больше не поддерживают параметры в URL для POST, а вместо этого требуют, чтобы они были в теле и в кодированной форме (в основном то же самое, но в теле и без начального ?).

Так что вам в основном нужно (не проверено):

 axios
      .post(
        "https://discordapp.com/api/oauth2/token",       
        "client_id=${process.env.DISCORD_CLIENTID}&client_secret=${process.env.DISCORD_SECRET}&grant_type=client_credentials&code=${accessCode}&redirect_uri=${redirect}&scope=identify%20email%20gdm.join"
       )
...