不使用基于浏览器的oauth身份validation,将文件从节点j传输到Dropbox

我正在从heroku运行一个基于nodejs + express的api服务器,并使用dropbox-js库。 这是我想要做的:

  1. 用户点击特定的API端点并启动进程。
  2. 通过节点进程生成一些文本文件并将其保存在服务器上
  3. 将这些文件传输到我自己使用我自己的凭据(用户和Dropbox应用程序)的保pipe箱。

当随机用户需要这样做的时候,永远不会有这样的情况。这是一个团队帐户,这是一个内部工具。

绊倒我的部分是,Dropbox想要打开一个浏览器窗口,并获得我的许可连接到应用程序。 问题是我显然不能在heroku实例上运行进程时点击button。

有没有办法让我完全授权在节点上访问应用程序?

我觉得我可以使用一个幻灯片过程来点击button – 但它似乎太复杂了,我想避免它,如果可能的话。

这是我的validation码:

// 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); }); }); 

带了我一些testing,但这是可能的。

首先,您需要通过浏览器进行身份validation,并保存由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 }); 

之后,你不会再为通过浏览器进行身份validation而感到困扰了(或者至less在没有令牌和秘密的情况下再次运行代码之前,这会使Dropbox生成一个新的令牌/秘密对并使旧的一些,或者应用凭证被吊销)。

或者你可以使用隐式授权并获得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));