让我首先为这篇文章的长度和有点咆哮的风格道歉。但据我所知,Box 没有提供除此站点之外的其他开发人员问题/疑虑的场所。
“授权”下的页面http://developers.box.com/docs/具有示例:
示例网址
示例回调
YOUR_REDIRECT_URI?code=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。为什么我需要为重定向 url 而烦恼?用户在设置过程中将他们的盒子用户名/密码提供给我的分机。OAuth 2 提供了一种“密码”授权类型,可用于直接将用户名和密码交换为访问令牌。无法框支持令牌请求,例如:
POST https://www.box.com/api/oauth2/token
grant_type=password&
username=USERNAME&
password=PASSWORD&
client_id=CLIENT_ID
这将消除完全授权用户的需要。用户已经向我的扩展程序提供了他的用户名/密码这一事实意味着授权。强制重定向 URL 会给像我这样的小型开发人员带来过多的义务。我是否必须维护和支付安全域才能每天处理数千(甚至数十万)个 XMLHttpRequest?我的 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()