Я пытаюсь обменять свой код 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-запросом. Что я могу сделать, чтобы получить ожидаемый токен на предъявителя?