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

Доступ к Google Диску с расширением Firefox

Я пытаюсь получить доступ (Google CRUD) к Google Диску из расширения Firefox. Расширения закодированы в Javascript, но ни один из двух существующих javascript SDK не подходит; клиентский SDK ожидает, что "окно" будет доступно, что не относится к расширениям, а серверный SDK, похоже, полагается на Node -специфические средства, как script, который работает в node больше не делает, когда я загружаю его в chrome после запуска его через браузер. Я застрял с использованием необработанных вызовов REST? node script, который работает, выглядит следующим образом:

var google = require('googleapis');
var readlineSync = require('readline-sync');

var CLIENT_ID = '....',
    CLIENT_SECRET = '....',
    REDIRECT_URL = 'urn:ietf:wg:oauth:2.0:oob',
    SCOPE = 'https://www.googleapis.com/auth/drive.file';

var oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);

var url = oauth2Client.generateAuthUrl({
  access_type: 'offline', // 'online' (default) or 'offline' (gets refresh_token)
  scope: SCOPE // If you only need one scope you can pass it as string
});

var code = readlineSync.question('Auth code? :');

oauth2Client.getToken(code, function(err, tokens) {
  console.log('authenticated?');
  // Now tokens contains an access_token and an optional refresh_token. Save them.
  if(!err) {
    console.log('authenticated');
    oauth2Client.setCredentials(tokens);
  } else {
    console.log('not authenticated');
  }
});

Я обернуваю node GDrive SDK с помощью браузера на этом script:

var Google = new function(){
    this.api = require('googleapis');
    this.clientID = '....';
    this.clientSecret = '....';
    this.redirectURL = 'urn:ietf:wg:oauth:2.0:oob';
    this.scope = 'https://www.googleapis.com/auth/drive.file';
    this.client = new this.api.auth.OAuth2(this.clientID, this.clientSecret, this.redirectURL);
  }
}

который затем вызывается при нажатии после нажатия кнопки (если в текстовом поле нет кода, он запускает браузер для его получения):

function authorize() {
  var code = document.getElementById("code").value.trim();

  if (code === '') {
    var url = Google.client.generateAuthUrl({access_type: 'offline', scope: Google.scope});
    var win = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow('navigator:browser');
    win.gBrowser.selectedTab = win.gBrowser.addTab(url);
  } else {
    Google.client.getToken(code, function(err, tokens) {
      if(!err) {
        Google.client.setCredentials(tokens);
        // store token
        alert('Succesfully authorized');
      } else {
        alert('Not authorized: ' + err); // always ends here
      }
    });
  }
}

Но это дает ошибку Not authorized: Invalid protocol: https:

4b9b3361

Ответ 1

Возможно, однако, в зависимости от варианта использования, это может также иметь ограниченный интерес.

Firefox поставляется с крошечным http-сервером, только голой костью. Он включен для целей тестирования, но это не является причиной для его игнорирования.

Давайте рассмотрим руководство по быстрому запуску для запуска приложения Drive в Javascript

Сложная часть - установить URI Redirect и Javascript Origins. Очевидно, что правильная настройка http://localhost, но как вы можете быть уверены, что каждый пользователь имеет порт 80?

Вы не можете и, если у вас нет контроля над своими пользователями, ни один порт не будет работать для всех. Имея это в виду, вы можете выбрать порт 49870 и молиться.

Итак, теперь URI переадресации и Javascript Origins установлены на http://localhost:49870

Предполагая, что вы используете SDK Add-on, сохраните quickstart.html (не забудьте добавить свой идентификатор клиента) в каталог data вашего расширения. Теперь отредактируйте свой main.js

const self = require("sdk/self");
const { Cc, Ci } = require("chrome");
const tabs = require("sdk/tabs");
const httpd = require("sdk/test/httpd");

var quickstart = self.data.load("quickstart.html");

var srv = new httpd.nsHttpServer();

srv.registerPathHandler("/gdrive", function handler(request, response){
  response.setHeader("Content-Type", "text/html; charset=utf-8", false);

  let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";
  response.write(converter.ConvertFromUnicode(quickstart));
})

srv.start(49870);

tabs.open("http://localhost:49870/gdrive");

exports.onUnload = function (reason) {
  srv.stop(function(){});
};

Обратите внимание, что quickstart.html не открывается как локальный файл с URI resource:. API Drive не понравится. Он подается по адресу http://localhost:49870/gdrive. Излишне говорить, что вместо статического html мы можем использовать шаблон или что-то еще. Кроме того, http://localhost:49870/gdrive можно создать с помощью обычного PageMod.

Я не считаю это реальным решением. Это просто лучше, чем ничего.

Ответ 2

Отсюда https://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code вы можете попробовать window = window || content || {}

Используйте клиентский API JavaScript, а не клиент node.js. Хотя браузер будет работать. Вам придется разоблачить секрет вашего клиента в последнем. Поток аутентификации на стороне клиента очень отличается от серверной. См. https://developers.google.com/accounts/docs/OAuth2

Сказав все это. Его действительно не так сложно реализовать приложение с вызовами на основе REST. Методы во всех клиентских библиотеках имитируют соответствующие URL-адреса REST. Вы можете настроить некоторые свои функции для обработки запроса и ответа, а остальные будут чувствовать то же самое.