通过request.js从代码中获取Dropbox OAuth令牌失败; 等效卷曲工作

Hen*_*all 3 javascript oauth http-post request dropbox-api

我正在尝试根据http api文档交换我的Dropbox oauth代码以获取令牌.

当我用curl执行命令时:

curl https://api.dropbox.com/1/oauth2/token \
-d code=<authorization code> \
-d grant_type=authorization_code \
-u <app key>:<app secret>
Run Code Online (Sandbox Code Playgroud)

一切正常,我收到了我的持票人令牌.不幸的是,似乎是在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);
});
Run Code Online (Sandbox Code Playgroud)

日志:

{ error_description: 'missing required field "grant_type"',
  error: 'invalid_request' }
Run Code Online (Sandbox Code Playgroud)

文档 说如果出现400错误(这是),我有:

输入参数错误.错误消息应指明哪一个和原因.

虽然如可以从上面的代码中可以看出,grant_type 被指定.


值得注意的是,文档提供了第二种身份验证选项,尽管这也失败了,尽管有一个不同的消息:

说明(删节)

需要使用应用程序的密钥和密钥对/ oauth2/token的调用进行身份验证.这些可以作为POST参数传递(参见下面的参数)或通过HTTP基本身份验证传递.如果使用基本身份验证,则应将app键作为用户名提供,并应提供app secret作为密码.

PARAMS

  • code String通过将用户定向到/ oauth2/authorize?response_type = code获取的代码.
  • grant_typeString授权类型,必须是authorization_code.
  • client_id 字符串如果凭据在POST参数中传递,则此参数应该存在,并且应该是应用程序的密钥(可在App Console中找到).
  • client_secret 字符串如果在POST参数中传递凭据,则此参数应该存在并且应该是应用程序的秘密.
  • redirect_uri String仅用于验证它是否与原始/ 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);
});
Run Code Online (Sandbox Code Playgroud)

日志:

{ error_description: 'No auth function available for given request',
  error: 'invalid_request' }
Run Code Online (Sandbox Code Playgroud)

如果我的两个请求尝试中的任何一个来自Dropbox的完整响应将有用,我将其发布在pastebin上.

我不包括redirect_uri因为我没有使用它作为代码流的一部分.根据文档允许这样做.在任何情况下,在ommitting时,我没有任何问题,curl它的命令成功.

考虑到我的API调用通过curl发送时成功,我显然对我的js请求做错了.我能做些什么来获得我期望的持有人令牌?

use*_*559 6

看起来在您的curl命令中,您发送了一个表单编码的POST请求(这是OAuth使用的),但在您的Node.js代码中,您发送的是JSON编码的请求.

尝试form: { ... }而不是json: { ... }.