首先让我为这篇文章的长度和咆哮风格道歉。但据我所知,Box不提供开发人员问题/关注的其他场所。
“授权”下的页面http://developers.box.com/docs/有以下示例:
示例网址
回调示例
YOUR_REDIRECT_URI?代码= THE_AUTHORIZATION_CODE
如果我将XMLHttpRequest(请参阅下面的代码*)与示例URL一起使用,我会得到一个包含“此应用程序要求您登录Box帐户”页面的HTML的响应。我保存HTML文档并在浏览器中打开它。当用户提供密码并单击“登录”时,将显示“此应用程序正在请求访问您的Box帐户的权限”页面。单击“允许”按钮后,页面将重定向到上例中的“YOUR_REDIRECT_URI”。
好的......现在怎么样?我的应用程序(Firefox扩展程序)如何访问“YOUR_REDIRECT_URI?code = THE_AUTHORIZATION_CODE”字符串?它只是坐在浏览器的位置栏中。即使我的redirect_url是一个有效的url,它执行一些从url中提取授权代码的php或cgi脚本,我的扩展代码应该如何检索呢?扩展名是所有客户端JavaScript。为什么我需要打扰重新直接的网址呢?在安装过程中,用户将其用户名/密码提供给我的分机。 OAuth 2提供“密码”授权类型,可用于直接交换访问令牌的用户名和密码。无法使用框支持令牌请求,如:
POST https://www.box.com/api/oauth2/token
grant_type=password&
username=USERNAME&
password=PASSWORD&
client_id=CLIENT_ID
这将消除完全授权用户的需要。用户已将其用户名/密码提供给我的扩展程序这一事实意味着授权。强制使用redirect_url会给像我这样的小型开发人员带来不必要的义务。我是否必须维护并支付安全域以每天处理数千(甚至数十万)XMLHttpRequests?我的Firefox扩展是开源的,任何人都可以免费使用。我没有足够的资源来支付这种开销。我在扩展程序中提供了盒子支持,以方便我的用户。 Box没有提供这样做的动力(甚至连联盟计划也不再奖励开发人员按照自己的方式发送客户)。
此外,似乎框(尚未)支持新API中的标记。我的扩展很大程度上依赖于这种能力。我已经在本论坛的其他地方读过正在考虑标记支持的内容,但我没有看到任何确认会发生这种情况的具体内容(并且及时地允许我们实施和测试它)。这对我来说是一个交易破坏者。
处理授权请求的JavaScript代码段(包含Firefox依赖项):
var Cc = Components.classes;
var Ci = Components.interfaces;
var Cu = Components.utils;
Cu.import("resource://gre/modules/NetUtil.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
var username = "my_username";
var password = encodeURIComponent("my_password");
var client_id = encodeURIComponent("my_clientId");
var state = encodeURIComponent("authenticated");
var redirect_uri = encodeURIComponent("https://somebogusurl.com");
var apiURL = encodeURIComponent("https:www.box.com/api/oauth2/authorize?");
var response_type = "code";
var resultsFile = "C:\\Users\\CBaker\\Desktop\\Extension Development\\FEBE\\FEBE 8.0\\work\\results.html"
var results, doc, tab;
function go(){
var req = new XMLHttpRequest();
req.open('POST', 'https://www.box.com/api/oauth2/authorize?response_type=code&client_id='+client_id+'&state='+state+'&redirect_uri='+redirect_uri, true);
req.onreadystatechange = function (aEvt) {
if (req.readyState != 4 || req.status != 200) {
alert("resStatus: "+resStatus);
return false;
}
results = req.responseText;
writeFile(resultsFile,results);
openFile(resultsFile);
};
req.send(null);
return true;
}
function writeFile(filename,data){
var file = new FileUtils.File(filename);
var ostream = FileUtils.openSafeFileOutputStream(file)
var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
createInstance(Ci.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8";
var istream = converter.convertToInputStream(data);
NetUtil.asyncCopy(istream, ostream, function(status) {
if (!Components.isSuccessCode(status)) {
// Handle error!
return;
}
});
}
function openFile(filename){
var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
var win = wm.getMostRecentWindow("navigator:browser");
win.openNewTabWith(resultsFile, this.docURL, null, null);
return
}
go()
答案 0 :(得分:0)
好的......现在怎么样?
Box的OAuth2实现是非常标准的。这实际上是在Javascript中支持OAuth2的一般问题。 OAuth2工作组将开发人员指向this Javascript library。
OAuth 2提供“密码”授权类型,可用于直接交换访问令牌的用户名和密码。
这(显然)要求用户提供他们的Box凭证。那只是一个非首发。它不仅仅是Box:我知道没有其他基于云的存储提供商支持这一点。