2

让我首先为这篇文章的长度和有点咆哮的风格道歉。但据我所知,Box 没有提供除此站点之外的其他开发人员问题/疑虑的场所。

“授权”下的页面http://developers.box.com/docs/具有示例:

示例网址

https://www.box.com/api/oauth2/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI

示例回调

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()
    
4

1 回答 1

0

好的……现在呢?

Box 的 OAuth2 实现非常标准。这实际上是在 Javascript 中支持 OAuth2 的普遍问题。OAuth2 工作组将开发人员引导至此 Javascript 库

OAuth 2 提供了一种“密码”授权类型,可用于直接将用户名和密码交换为访问令牌。

这将(显然)要求用户向您提供他们的 Box 凭据。这简直是​​一个行不通的人。不仅仅是 Box:我知道没有其他基于云的存储提供商支持这一点。

于 2013-07-29T16:17:26.143 回答