Перенесите файлы в 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);
});
});
Ответы
Ответ 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));