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
codeString通过将用户定向到/ oauth2/authorize?response_type = code获取的代码.grant_typeString授权类型,必须是authorization_code.client_id字符串如果凭据在POST参数中传递,则此参数应该存在,并且应该是应用程序的密钥(可在App Console中找到).client_secret字符串如果在POST参数中传递凭据,则此参数应该存在并且应该是应用程序的秘密.redirect_uriString仅用于验证它是否与原始/ 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请求做错了.我能做些什么来获得我期望的持有人令牌?
看起来在您的curl命令中,您发送了一个表单编码的POST请求(这是OAuth使用的),但在您的Node.js代码中,您发送的是JSON编码的请求.
尝试form: { ... }而不是json: { ... }.