javascript - arg - 通過request.js從代碼獲取Dropbox OAuth令牌失敗; 等效捲曲作品



dropbox api教學 (1)

我試圖根據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 /令牌需要使用應用程序的密鑰和秘密進行身份驗證。 這些可以作為POST參數傳遞(參見下面的參數)或通過HTTP基本認證。 如果使用基本身份驗證,則應提供應用程序密鑰作為用戶名,應用程序密碼應作為密碼提供。

PARAMS

  • code String通過將用戶指向/ oauth2 / authorize?response_type = code獲取的代碼。
  • grant_type字符串授權類型,必須是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發送成功,我顯然做錯了我的請求。 我能做些什麼來獲得我期望的不記名令牌?


它看起來像你的curl命令,你發送一個表單編碼的POST請求(這是OAuth使用的),但在你的Node.js代碼中,你發送一個JSON編碼的請求。

試試form: { ... }而不是json: { ... }





dropbox-api