1

我们有一个要求,我们希望能够从基本应用程序 (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 的响应。我无法弄清楚的问题是,如何在浏览器的新窗口/选项卡上呈现响应。

4

1 回答 1

2

最简单的解决方案是使用以下 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,则可能需要更复杂的后端实现。

于 2013-02-19T09:28:21.193 回答