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

Get Dropbox OAuth Token from Code via request.js Fails; Equivalent curl Works

本文关键字:失败 js 工作 令牌 OAuth 请求 代码 Dropbox 获取      更新时间:2023-09-26

我正在尝试根据 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>

一切正常,我被归还了我的持有者令牌。不幸的是,什么似乎是用 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 字符串 通过将用户定向到/oauth2/authorize?response_type=code 获取的代码。
  • grant_type 字符串 授权类型,必须authorization_code
  • client_id字符串 如果在 POST 参数中传递凭据,则此参数应存在,并且应该是应用的密钥(可在应用控制台中找到)。
  • 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 请求有问题。我该怎么做才能获得持有者令牌 I期望?

看起来在

curl命令中,您正在发送表单编码的 POST 请求(这是 OAuth 使用的),但在 Node.js 代码中,您正在发送 JSON 编码的请求。

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