我们有一个要求,我们希望能够从基本应用程序 (BaseApp) 启动新应用程序 (NewApp)。 BaseApp 和 NewApp 的登录凭据相同,因为它们使用相同的身份存储。 BaseApp 和 NewApp 在不同的技术栈上,都是 Web 应用程序。它们托管在不同的服务器上。 NewApp 为网络访问提供基本的身份验证。
如何使用 java 脚本从我的 BaseApp 上的链接启动 NewApp。我希望能够注入(inject) Basic Auth 凭据。
我尝试过使用 xmlHTTPRequest,但它似乎更适合调用 REST 服务和处理获取的数据,而不是启动 URL。 使用 java 脚本 window.open(url) 不允许我注入(inject)授权 header !
还有什么我可以探索的吗?
附加信息: BaseApp 的 session cookie 不适用于 NewApp。当我们第一次在 BaseApp 上完成 Basic Auth 时,它会生成一个新的 Session Cookie,需要使用它。 通过 xhr,我们可以调用 NewApp 的 URL(使用 Basic Auth)。这将返回带有 session cookie 的响应。 我无法弄清楚的问题是,如何在浏览器的新窗口/选项卡上呈现响应。
最佳答案
最简单的解决方案是使用以下 url 调用新窗口
http://<user>:<pass>@newapp
但这不是一个好的解决方案,因为您会看到纯文本形式的凭据。您最好尝试以下解决方案之一:
- 如果您使用 session cookie,通常可以将其附加到 url,例如
http://newapp?JSESSIONID=kjasbfkji877786sdf
。- 要么您可以使用与您的基本应用程序相同的 Cookie(如果应用程序位于不同的机器上,那应该不可能)
- 创建 XMLHttpRequest 调用 NewApp 并通过 BasicAuth 进行身份验证。响应 header 应包含来自其他服务器的所需 session cookie。然后您可以使用所需的 cookie 调用 NewApp。
- 如果您没有 session cookie,您也可以尝试第二种解决方案 (XHR),因为如果创建了 session ,它也会存储在浏览器中,并且浏览器可以自行管理 session 处理。
所以在案例 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,则可能需要更复杂的后端实现。
关于javascript - 使用 xmlHTTPRequest 在新窗口中打开安全应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14953577/