Я успешно реализовал поток OAuth2 от Discord, используя тип предоставления кода авторизации в моем приложении. Конечный пользователь переходит по ссылке Discord OAuth2 для моего бота, авторизует его доступ, и Discord перенаправляет их обратно на мой сайт с помощью code
строки запроса. Затем бот обменивает этот код на токен доступа, запрашивая API Discord. Документация по этому процессу доступна здесь для справки.
Однако, примерно каждые 50-100 запросов к конечной точке обмена, я получаю 403 с ошибкой invalid_grant
и description Invalid "code" in request.
Честно говоря, я не понимаю, как код, только что предоставленный системой Discord, мгновенно становится недействительным. Тот же пользователь может завершить процесс снова, и ошибка не возвращается во второй раз.
В отчаянии я попытался включить опцию в панели инструментов для разработчиков с именем Requires OAuth2 Code Grant
, увидев, что она говорит "если вашему приложению требуется несколько областей ", но это не произвело никакого эффекта. Я также пробовал бесконечную отладку, но обстоятельства в каждом случае кажутся случайными. Как ни странно, я не могу найти никого с такой же проблемой в Интернете.
Ниже приведен запрос, который я делаю в Node.js, используя библиотеку superagent . Он соответствует документации и работает отлично, за исключением случайного ответа, описанного как ошибка.
superagent.post('https://discordapp.com/api/v6/oauth2/token')
.type('x-www-form-urlencoded')
.set('Content-Type', 'application/x-www-form-urlencoded')
.send({
client_id: process.env.BOT_ID,
client_secret: process.env.BOT_SECRET,
grant_type: 'authorization_code',
code,
redirect_uri: process.env.OAUTH2_REDIRECT_URI,
scope: 'identify guilds.join',
});
Я могу подтвердить, что все переменные соответствуют ожидаемым значениям. Значение redirect_uri
соответствует значению redirect_uri
в исходном URL. code
- это значение строки запроса code
, возвращаемой потоком OAuth2.
Что (если что-то) я делаю неправильно, что вызывает ошибку?
Обновление 1:
Discord направил меня к репозиторию API GitHub, и я обнаружил, что проблема закрыта здесь . Прокомментировано и будет обновляться здесь, если я получу какую-либо полезную информацию или полностью решу проблему (надеюсь, дело).