2013-05-01 22 views
17

我正在從heroku運行基於nodejs + express的api服務器並使用dropbox-js庫。以下是我想要做的:無需基於瀏覽器的oauth身份驗證,將文件從節點j傳輸到Dropbox

  1. 用戶點擊特定的api端點並啓動進程。
  2. 通過節點進程生成一些文本文件並將它們保存在服務器上
  3. 將這些文件傳輸到我使用我自己的憑據(用戶和Dropbox應用程序)擁有的保管箱中。

隨機用戶需要這樣做,永遠不會有這樣的情況..這是一個團隊帳戶,這是一個內部工具。

絆倒我的部分是dropbox想要打開瀏覽器窗口並獲得我的許可連接到應用程序。問題是我顯然無法在heroku實例上運行進程時點擊按鈕。

有沒有什麼方法可以讓我完全在節點中授權訪問應用程序?

我覺得我可以使用phantomJS過程來點擊按鈕 - 但它看起來太複雜了,如果可能的話我想避免它。

這裏是我的驗證碼:

// Libraries 
    var Dropbox   = require('dropbox'); 

    var DROPBOX_APP_KEY = "key"; 
    var DROPBOX_APP_SECRET = "secret"; 

    var dbClient = new Dropbox.Client({ 
     key: DROPBOX_APP_KEY, secret: DROPBOX_APP_SECRET, sandbox: false 
    }); 

    dbClient.authDriver(new Dropbox.Drivers.NodeServer(8191)); 

    dbClient.authenticate(function(error, client) { 
     if (error) { 
     console.log("Some shit happened trying to authenticate with dropbox"); 
     console.log(error); 
     return; 
     } 


     client.writeFile("test.txt", "sometext", function (error, stat) { 
     if (error) { 
      console.log(error); 
      return; 
     } 

     console.log("file saved!"); 
     console.log(stat); 
     }); 
    }); 

回答

19

我花了一點的測試,但它是可能的。

首先,你需要通過瀏覽器進行身份驗證和保存由Dropbox的返回的令牌和令牌密鑰:

dbClient.authenticate(function(error, client) { 
    console.log('connected...'); 
    console.log('token ', client.oauth.token);  // THE_TOKEN 
    console.log('secret', client.oauth.tokenSecret); // THE_TOKEN_SECRET 
    ... 
}); 

一旦你的令牌和祕密,你可以在Dropbox.Client使用它們構造函數:

var dbClient = new Dropbox.Client({ 
    key   : DROPBOX_APP_KEY, 
    secret  : DROPBOX_APP_SECRET, 
    sandbox  : false, 
    token  : THE_TOKEN, 
    tokenSecret : THE_TOKEN_SECRET 
}); 

之後,你不會打擾具有了通過瀏覽器進行身份驗證(或至少直到有人再次運行代碼,而無需令牌和祕密,這將使Dropbox的根兒吃了一個新的令牌/祕密對並且使舊的令牌/祕密對無效,或者撤銷了應用憑證)。

+2

非常感謝您花時間測試出來!這正是我所期待的。乾杯! – 2013-05-02 17:09:51

+0

我不知道我在做什麼錯,但我使用上面的代碼與一個密鑰,祕密,令牌密鑰和令牌密鑰,我知道所有這些都是有效的,並且我無法獲得超出當我嘗試上傳文件時出現未經授權的錯誤。我在這裏錯過了什麼? – Sydin 2013-11-15 23:24:29

+1

更新:我的猜測是這與dropbox-js移動到oauth2有關,但它看起來像憑證正在改變;我正在緩存一個令牌而不是一個令牌和祕密,這就是訣竅。 – Sydin 2013-11-16 01:45:06

9

或者你可以使用隱式授權並獲得oauth標記。

 var client = new Dropbox.Client({ 
      key: "xxxxx", 
      secret: "xxxxx", 
      token:"asssdsadadsadasdasdasdasdaddadadadsdsa", //got from implicit grant 
      sandbox:false 
     }); 

根本沒有必要去瀏覽器。這條線不再需要!

client.authDriver(new Dropbox.AuthDriver.NodeServer(8191)); 
+0

這是正確的,但它被稱爲訪問令牌,而不是隱式授權:https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account/ – 2015-06-14 22:13:41

+0

是的,這是程序的最佳方式。 – 2015-12-11 18:00:12