#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. На самом деле это момент «ага». Спасибо