Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无需基于浏览器的oauth身份验证即可将文件从node js传输到dropbox_Node.js_Express_Dropbox Api - Fatal编程技术网

Node.js 无需基于浏览器的oauth身份验证即可将文件从node js传输到dropbox

Node.js 无需基于浏览器的oauth身份验证即可将文件从node js传输到dropbox,node.js,express,dropbox-api,Node.js,Express,Dropbox Api,我正在从heroku运行一个基于nodejs+express的api服务器并使用该库。以下是我想做的: 用户点击特定的api端点并启动流程 通过节点进程生成一些文本文件并将其保存在服务器上 将这些文件传输到我使用自己的凭据(用户和dropbox应用程序)拥有的dropbox 永远不会有随机用户需要这样做的情况。。这是一个团队帐户,这是一个内部工具 让我大吃一惊的是dropbox想打开一个浏览器窗口,并获得我连接应用程序的许可。问题是,当进程在heroku实例上运行时,我显然无法单击该按钮 我有没

我正在从heroku运行一个基于nodejs+express的api服务器并使用该库。以下是我想做的:

  • 用户点击特定的api端点并启动流程
  • 通过节点进程生成一些文本文件并将其保存在服务器上
  • 将这些文件传输到我使用自己的凭据(用户和dropbox应用程序)拥有的dropbox
  • 永远不会有随机用户需要这样做的情况。。这是一个团队帐户,这是一个内部工具

    让我大吃一惊的是dropbox想打开一个浏览器窗口,并获得我连接应用程序的许可。问题是,当进程在heroku实例上运行时,我显然无法单击该按钮

    我有没有办法完全在node中授权访问应用程序

    我觉得我可以使用一个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);
          });
        });
    

    我做了一些测试,但这是可能的

    首先,您需要通过浏览器进行身份验证,并保存Dropbox返回的令牌和令牌密钥:

    一旦您拥有令牌和密码,就可以在
    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生成新的令牌/密码对并使旧的令牌/密码对无效,或者应用程序凭据被吊销).

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

    非常感谢您抽出时间来测试它!这正是我想要的。干杯我不确定我做错了什么,但我使用了上面的代码和一个密钥、密钥、令牌密钥和令牌密钥,我知道它们都是有效的,当我尝试上载文件时,除了未经授权的错误之外,我无法获得任何东西。更新:我猜这与dropbox js迁移到oauth2有关,但似乎凭证正在更改;我正在缓存一个令牌,而不是一个令牌和密码,这就是关键所在。我发现这个站点可以很容易地生成一个oauth2令牌,以这种方式使用:这是正确的,但它被称为访问令牌,而不是隐式授权:是的,这是实现该过程的最佳方式。
       client.authDriver(new Dropbox.AuthDriver.NodeServer(8191));