我正在尝试从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);
}
}
然后在单击按钮后调用(如果文本字段没有代码则启动浏览器以获取一个):
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:
答案 0 :(得分:1)
从这里https://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code,您可以尝试window = window || content || {}
使用JavaScript客户端API而不是node.js客户端。虽然browserify会使它工作。您必须在后者中公开您的客户机密。客户端身份验证的流程非常不同于服务器端。请参阅https://developers.google.com/accounts/docs/OAuth2
说完了这一切。使用基于REST的调用来实现应用程序并不困难。所有客户端库中的方法都模仿相应的REST URL。您可以设置自己的一些功能来处理请求和响应,其余功能也会一样。
答案 1 :(得分:1)
但是,根据用例的不同,它可能也是有限的。
Firefox附带了一个微小的http服务器,只是简单的骨头。它包含在测试目的中,但这不是忽视它的理由。
让我们关注quickstart guide for running a Drive app in Javascript
棘手的部分是设置重定向URI和Javascript起源。显然正确的设置是http://localhost
,但是如何确保每个用户都有端口80可用?
除非您可以控制您的用户,否则您无法保证所有人都无法使用该端口。考虑到这一点,让我们选择端口49870并祈祷。
所以现在重定向URI和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。 Drive API不会那样。它在网址http://localhost:49870/gdrive
上提供。不用说,我们可以使用模板或其他任何东西代替静态html。此外,http://localhost:49870/gdrive
可以使用常规PageMod脚本编写。
我不认为这是一个真正的解决方案。它总比没有好。