【问题标题】:using xmlHTTPRequest for opening a secure application in a new window使用 xmlHTTPRequest 在新窗口中打开安全应用程序
【发布时间】:2013-02-20 10:33:33
【问题描述】:

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

如何使用 java 脚本从 BaseApp 上的链接启动 NewApp。我希望能够注入基本身份验证凭据。

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

还有什么我可以探索的吗?

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

【问题讨论】:

    标签: javascript web-applications xmlhttprequest


    【解决方案1】:

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

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

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

    1. 如果您使用会话 cookie,通常可以将其附加到 URL,例如 http://newapp?JSESSIONID=kjasbfkji877786sdf
      1. 您可以在基本应用程序中使用相同的 Cookie(如果应用程序位于不同的机器上,这应该是不可能的)
      2. 创建 XMLHttpRequest 调用 NewApp 并通过 BasicAuth 进行身份验证。响应标头应包含来自其他服务器的所需会话 cookie。然后您可以使用所需的 cookie 调用 NewApp。
    2. 如果您没有会话 cookie,您也可以尝试第二种解决方案 (XHR),因为如果创建了会话,它也会存储在浏览器中,并且浏览器可以自行管理会话处理。

    所以在案例 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,则可能需要更复杂的后端实现。

    【讨论】:

    • 感谢您的回复!我无法使用 xhr.getResponseHeader("Cookie");这给出了一个错误:拒绝获取不安全的标头“Cookie”。
    • 就我而言,BaseApp 的会话 cookie 不适用于 NewApp。当我们第一次在 BaseApp 上完成 Basic Auth 时,它会生成一个需要使用的新 Session Cookie。通过 xhr,我们可以调用 NewApp 的 URL(使用 Basic Auth)。这将返回带有会话 cookie 的响应。我无法弄清楚的问题是,如何在浏览器的新窗口/选项卡上呈现响应。
    • 打开一个新窗口是用javascript中的window.open(url)实现的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2013-09-27
    • 2013-11-07
    • 2019-06-25
    • 2014-02-18
    • 2017-08-21
    相关资源
    最近更新 更多