Получить токен Dropbox OAuth из кода с помощью request.js Эквивалентный завиток работает

Я пытаюсь обменять свой код oauth Dropbox на токен в соответствии с http API документация.

Когда я выполняю команду с завитком таким образом:

curl https://api.dropbox.com/1/oauth2/token \
-d code=<authorization code> \
-d grant_type=authorization_code \
-u <app key>:<app secret>

все работает нормально, и мне вернули токен на предъявителя. К сожалению, то, что кажется эквивалентным кодом, написанным в node.js с модулем запроса, терпит неудачу.

var request = require("request");
var config = require("./config.json");

request({
  url: "https://api.dropboxapi.com/1/oauth2/token",
  method: "POST",
  auth: {
    user: config.client_id,
    pass: config.client_secret
  },
  json: {
    code: config.code,
    grant_type: "authorization_code"
  } 
}, function(err, resp, body) {
  if (err) throw err;
  console.log(body);
});

журналы:

{ error_description: 'missing required field "grant_type"',
  error: 'invalid_request' }

Документы говорят, что в случае ошибки 400 (это так) , У меня есть:

Неверный входной параметр. В сообщении об ошибке должно быть указано, что именно и почему.

Хотя, как видно из приведенного выше кода, указывается grant_type .


Примечательно, что документы дают второй вариант аутентификации, хотя он тоже не работает, хотя и с другим сообщением:

Описание (сокращенное)

Вызовы /oauth2/token должны быть аутентифицированы с использованием ключа и секрета приложения. Их можно передать как параметры POST (см. параметры ниже) или через базовую аутентификацию HTTP. Если используется обычная проверка подлинности, в качестве имени пользователя следует указать ключ приложения, а в качестве пароля — секрет приложения.

Параметры

  • code String Код, полученный путем направления пользователей на /oauth2/authorize?response_type=code.
  • grant_type String Тип гранта, который должен быть authorization_code.
  • client_id Строка Если учетные данные передаются в параметрах POST, этот параметр должен присутствовать и должен быть ключом приложения (находится в App Console).
  • client_secret Строка Если учетные данные передаются в параметрах POST, этот параметр должен присутствовать и должен быть секретом приложения.
  • redirect_uri Строка Используется только для проверки соответствия исходному /oauth2/authorize, не используется для повторного перенаправления.

Моя попытка альтернативной процедуры аутентификации:

var request = require("request");
var config = require("./config.json");

request({
  url: "https://api.dropboxapi.com/1/oauth2/token",
  method: "POST",
  json: {
    code: config.code,
    grant_type: "authorization_code",
    client_id: config.client_id,
    client_secret: config.client_secret
  } 
}, function(err, resp, body) {
  if (err) throw err;
  console.log(body);
});

журналы:

{ error_description: 'No auth function available for given request',
  error: 'invalid_request' }

В случае, если полный ответ от Dropbox для любой из моих двух попыток запроса будет полезен, я разместил его на pastebin.

Я не включаю redirect_uri, так как я не использовал его как часть потока кода. Это разрешено в соответствии с документами. В любом случае, у меня нет никаких проблем, если я опускаю его в команде curl, которая выполняется успешно.

Учитывая, что мой вызов API выполняется успешно при отправке через curl, я явно делаю что-то не так с моим js-запросом. Что я могу сделать, чтобы получить ожидаемый токен на предъявителя?


person Henry Marshall    schedule 27.01.2016    source источник


Ответы (1)


Похоже, что в вашей команде curl вы отправляете запрос POST в кодировке формы (что и использует OAuth), но в коде Node.js вы отправляете запрос в кодировке JSON.

Попробуйте form: { ... } вместо json: { ... }.

person user94559    schedule 27.01.2016