Неподдерживаемый тип предоставления при получении токена OAuth для Reddit API

Я пытаюсь получить токен 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, узнает, что здесь происходит.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
893
1

Ответы 1

Проблема заключалась в использовании объекта 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('&')
}

Другие вопросы по теме