Ошибка Discord Oauth2 при получении ‘недопустимого клиента’

#oauth-2.0 #discord

#oauth-2.0 #Discord

Вопрос:

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

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

Во-первых, я нажимаю на эту конечную точку:

 https://discordapp.com/api/oauth2/authorize?client_id=${process.env.CLIENT_ID}amp;redirect_uri=http://localhost:5000/login/discord/callbackamp;response_type=codeamp;scope=identify email gdm.join
  

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

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

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

 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}amp;client_secret=${process.env.DISCORD_SECRET}amp;grant_type=authorization_codeamp;code=${accessCode}amp;redirect_uri=${redirect}amp;scope=identify email gdm.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:

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

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

Итак, вам в основном нужно (не тестировалось):

  axios.post(
        `https://discordapp.com/api/oauth2/token`,       
        `client_id=${process.env.DISCORD_CLIENTID}amp;client_secret=${process.env.DISCORD_SECRET}amp;grant_type=client_credentialsamp;code=${accessCode}amp;redirect_uri=${redirect}amp;scope=identify email gdm.join`
       )
  

Комментарии:

1. Это сработало! Я подумал, что Discord что-то изменил… вы только что избавили меня от множества потраченных впустую часов. К вашему сведению, единственное, что я сделал по-другому, это добавил объект конфигурации с заголовком, установленным в application / x-www-form-urlencoded

Ответ №2:

Я знаю, что на вопрос уже был дан ответ, но в моем случае я скопировал неправильный секретный ключ. Просто убедитесь, что вы скопировали правильный.

Секретный ключ расположен на вкладке OAuth2, а не на вкладке «Общая информация» на панели управления разработчика discord.

Комментарии:

1. Я допустил ту же ошибку. Спасибо за подсказку!

2. На самом деле это момент «ага». Спасибо