Я пытаюсь получить токен OAuth для API Reddit после Инструкции по OAuth только для приложений. Мое приложение Reddit - это установленное приложение, поэтому для моего grant_type я использую https://oauth.reddit.com/grants/installed_client.
В настоящее время я запускаю очень короткий JS-скрипт для запроса API и получения токена:
const APP_ID = 'MY_APP_ID'
const DEVICE_ID = 'TRACKING_ID_20_TO_30_CHARS'
let form = new FormData()
form.append('grant_type', 'https://oauth.reddit.com/grants/installed_client')
form.append('device_id', DEVICE_ID)
fetch('https://www.reddit.com/api/v1/access_token', {
method: 'POST',
headers: new Headers({
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Basic ${btoa(`${APP_ID}:`)}`,
}),
body: form })
.then(handleResponse)
.then(function(data) {
console.info(data)
})
.catch(error => console.error(error))
function handleResponse(response) {
return response.json()
}(Примечание: запуск фрагмента как есть приведет к ошибке NetworkError, потому что APP_ID не настоящий, и я не хочу выдавать свой.)
Я получаю такой ответ:
{
"error": "unsupported_grant_type"
}
Когда я пытаюсь выполнить тот же запрос API с помощью клиента REST, я получаю ожидаемый ответ, поэтому я думаю, что проблема связана с JavaScript. Поскольку grant_type соответствует тому, что написано в инструкции, я не совсем уверен, что делать с ошибкой. Я надеюсь, что кто-то другой, более опытный с OAuth, узнает, что здесь происходит.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема заключалась в использовании объекта FormData. На более ранних этапах устранения неполадок я нашел этот ответ на Reddit и решил использовать его, но у меня это не сработало.
Он отправлял данные как multipart/form-data, а не как application/x-www-form-urlencoded, что не нравилось серверу OAuth Reddit. Я написал вспомогательную функцию на основе этот ответ, которая сработала:
function urlEncode(data) {
let out = [];
for (let key in data) {
out.push(`${key}=${encodeURIComponent(data[key])}`);
}
return out.join('&')
}