Подтвердить что ты не робот

Перенесите файлы в Dropbox из node js без аутентификации на основе браузера

Я запускаю api-сервер nodejs + express на основе heroku и используя библиотеку dropbox-js. Вот что я хотел бы сделать:

  • Пользователь попадает в конкретную конечную точку api и запускает процесс.
  • Сгенерировать некоторые текстовые файлы с помощью процесса node и сохранить их на сервере
  • Перенесите эти файлы в ящик, который у меня есть, используя мои собственные учетные данные (приложение пользователя и 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);
      });
    });
4b9b3361

Ответ 1

Принял немного тестирования, но это возможно.

Сначала вам необходимо пройти аутентификацию через браузер и сохранить секретный токен и токен, которые возвращаются 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

Или вы можете просто использовать неявное предоставление и получить токен 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));