使用xmlHTTPRequest在新窗口中打开安全应用程序

时间:2013-02-19 09:06:02

标签: javascript web-applications xmlhttprequest

我们需要能够从基础应用程序(BaseApp)启动新应用程序(NewApp)。 BaseApp和NewApp的登录凭据相同,因为它们使用相同的标识存储。 BaseApp和NewApp位于不同的技术堆栈上,都是Web应用程序。它们托管在不同的服务器上。 NewApp为Web访问提供基本的Auth。

如何使用java脚本从BaseApp上的链接启动NewApp。我希望能够注入Basic Auth凭证。

我尝试过使用xmlHTTPRequest,但它似乎更倾向于调用REST服务并处理获取的数据而不是启动URL。 使用java脚本window.open(url)不允许我注入授权头!

我还能探索什么?

其他信息: BaseApp的会话cookie不适用于NewApp。当我们首次在BaseApp上完成Basic Auth时,它会生成一个需要使用的新Session Cookie。 通过xhr,我们可以为NewApp调用URL(使用Basic Auth)。这将返回带有会话cookie的响应。 我无法弄清楚的问题是,如何在浏览器的新窗口/选项卡上呈现响应。

1 个答案:

答案 0 :(得分:2)

最简单的解决方案是使用以下网址调用新窗口

http://<user>:<pass>@newapp

但这不是一个好的解决方案,因为您会看到纯文本的凭据。您最好尝试以下解决方案之一:

  1. 如果您使用会话Cookie,通常可以将其附加到http://newapp?JSESSIONID=kjasbfkji877786sdf之类的网址。
    1. 您可以使用基础应用程序中的相同Cookie(如果应用程序位于不同的计算机上,则无法实现)
    2. 创建XMLHttpRequest,通过BasicAuth调用NewApp和身份验证。响应头应包含来自其他服务器的所需会话cookie。然后,您可以使用所需的cookie调用NewApp。
  2. 如果您没有会话cookie,您还可以尝试第二个解决方案(XHR),因为如果创建了会话,它也会存储在浏览器中,浏览器可以自行管理会话处理。
  3. 所以在案例1.2中。 2.你应该做以下事情:

    var XMLReq = new XMLHttpRequest();
    XMLReq.open("GET", "url", asynchronous?, "user", "password");
    XMLReq.send(null);
    

    案例1.2。您需要为后续调用提供额外的处理程序:

    XMLReq.onload = function() {
        window.open('http://NewApp?JSESSIONID='+XMLReq.getResponseHeader('Cookie')); 
        // note that 'JSESSIONID' depends on your backend implementation, this example is made for java backend
    }
    

    如果是2,那就是

    XMLReq.onload = function() {
        window.open('http://NewApp'); 
    }
    

    在这种情况下,最好的解决方案是OAuth或OpenID,但这取决于您的用例和系统环境,如果目前不支持OAuth或OpenID,则可能需要更复杂的后端实现。