从Firefox扩展程序访问Google Drive

我试图从Firefox扩展程序访问(CRUD)Google云端硬盘。 扩展以Javascript编码,但两个现有的JavaScript SDK似乎都不合适; 客户端SDK期望“窗口”可用,而扩展中则不是这样,而服务器端SDK似乎依赖于特定于节点的工具,因为当我加载时,在节点中工作的脚本不再执行它通过browserify运行后在Chrome中。 我坚持使用原始REST调用?工作的Node脚本如下所示:

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

我在这个脚本上使用browserify来包装节点GDrive SDK:

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

然后在点击一个button之后调用它(如果文本字段没有代码,它将启动浏览器来获取):

 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:

但是,根据使用情况,也可能有限的兴趣。

Firefox附带一个微小的http服务器,只是简单的骨头。 它包含在testing目的中,但这不是一个忽略它的理由。

让我们按照快速入门指南在Javascript中运行云端硬盘应用程序

棘手的部分是设置redirectURI和JavaScript起源。 显然正确的设置是http://localhost ,但是你怎么能确定每个用户有80端口可用?

你不能和,除非你有控制你的用户,没有端口是保证为每个人工作。 考虑到这一点,让我们select港口49870和祈祷。

所以现在redirectURI和Javascript起源被设置为http://localhost:49870

假设您使用附加SDK,请将quickstart.html (请记住添加您的客户端ID)保存在您的扩展的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没有以resource: URI的forms作为本地文件打开。 Drive API不会那样。 它在url http://localhost:49870/gdrive 。 不用说,而不是静态HTML,我们可以使用模板或其他任何东西。 此外, http://localhost:49870/gdrive可以用普通的PageMod编写脚本。

我不认为这是一个真正的解决scheme。 只是比没有好。

从这里https://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code你可以试试;window = window || content || {} window = window || content || {}

使用JavaScript客户端API而不是node.js客户端。 虽然browserify将使其工作。 你将不得不在后者中揭露你的客户秘密。 客户端authentication的stream程比服务器端差很多。 请参阅https://developers.google.com/accounts/docs/OAuth2

说完这一切。 使用基于REST的调用来实现应用程序并不困难。 所有客户端库中的方法都模仿相应的REST URL。 你可以设置你自己的一些function来处理请求和响应,其余的感觉是一样的。