OAuth 2和JavaScript - 如何获取授权代码

时间:2013-07-26 20:01:50

标签: box-api

首先让我为这篇文章的长度和咆哮风格道歉。但据我所知,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?代码= 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()
    

1 个答案:

答案 0 :(得分:0)

  

好的......现在怎么样?

Box的OAuth2实现是非常标准的。这实际上是在Javascript中支持OAuth2的一般问题。 OAuth2工作组将开发人员指向this Javascript library

  

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

这(显然)要求用户提供他们的Box凭证。那只是一个非首发。它不仅仅是Box:我知道没有其他基于云的存储提供商支持这一点。