从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来处理请求和响应,其余的感觉是一样的。