firefox中的window.addeventlistener不会在http状态302上触发事件

时间:2013-10-22 21:06:16

标签: angularjs

我正在尝试使用身份验证脚本。它由我公司提供,因为它是他们在其他系统中使用的。我在chrome和firefox v19之间存在奇怪的不一致行为(目前我们桌面环境中的标准是什么)。

这个过程非常简单:我们创建一个iframe,它指向SAML服务。我有一个angularJS SPA正在等待SAML服务使用JSON对象进行响应,该对象将告诉我的应用程序用户是否经过身份验证。然后我们运行我们的应用程序(使用angular.bootstrap(document, ['mySPA']);或者在未经授权的情况下执行其他操作。

有问题的代码是:

(function createIframe() {

    var iframe = document.createElement("iframe");
    setAttributes(iframe, {
        "name": "auth",
        "id": "myFrame",
        "src": "https://api.SAML2AuthService",
        "height": "0",
        "width": "0",
        "border": "0"
    });
    document.body.appendChild(iframe);
    // Create IE + others compatible event handler
    authEventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
    authEvent = window[authEventMethod];
    authMessageEvent = authEventMethod == "attachEvent" ? "onmessage" : "message";
})();

// Listen to auth iframe message
authEvent(authMessageEvent, function (e) {
    var authorized = false;
    for (var i = 0; i < 2; i++) {
        Authentication = Auth.getInstance();
        if (e.data !== null) {
            data = e.data;
            if (data.isAuthorized === "true" && data.authorizationToken !== null) {

                Authentication.isAuthorized = e.data.isAuthorized;
                Authentication.principal = e.data.principal;
                Authentication.description = e.data.description;
                Authentication.authorizationToken = e.data.authorizationToken;
                authorized = true;
                break;
            }
        }
    }
    if (!authorized) {
        console.log("Unauthorized");
    }
}, false);

然后,我们打电话给:

    angular.element(document).ready(function() {
      angular.module( 'mySPA', []
         ...
      });
      angular.bootstrap(document, ['associateDesktop']);
    });

但是,由于我无法控制的原因,SAML服务会执行重定向以获取实际凭据。我的浏览器的调试控制台将这些显示为HTTP状态302,然后(我假设)重定向并以HTTP状态200的形式返回给我。

具体来说,我的问题是我附加到窗口的AuthEvent事件并不总是被解雇。在chrome中,如果我清除所有浏览数据(cookie等),authEvent会触发,我会按照我的预期进行身份验证(或不进行身份验证)。在Firefox中,如果我清除所有缓存数据,authEvent永远不会被解雇。我把事件附加错了吗? Firefox不会为302调用这样的事件吗?角度ready()功能是否会做我不期望的事情(不耐烦)?

提前致谢!

1 个答案:

答案 0 :(得分:0)

这个相同的代码现在可以在FF 19中运行。我没有改变任何东西,我最终发现事后服务正在返回一些略有错误的数据,显然chrome能够优雅地处理,但firefox没有。那个格式错误的数据已经修复,所以现在代码可以工作了。我无法再访问发送到浏览器的原始(据称是坏的)内容,因此我无法在此处发布以显示有用的错误和解决方案。

但是,我想至少记录上面的代码工作正常,并在这里发布一个更简单的版本,所以任何寻找可以使用的代码的人都会有所作为。对不起,我无法更好地回答实际问题。

家长html

<html>
<script>
var authEvent = function(event) {
  // debugger;
  var div = document.getElementById("response");
  div.innerHTML = event.data.message;
};

if (window.addEventListener) {
  window.addEventListener("message", authEvent, false);
}
else {
 window.attachEvent("onmessage", authEvent); 
}

</script>
<body>
  <iframe src="frame.html"></iframe>
  <br /><br /><br />
  <div id="response">No response...</div>
</body>

iFrame html

<!DOCTYPE html>
<html>
  <head>
  <title>test</title>
  <script>
    var authResponse = {
      "message": "Iframe called parent successfully!"
    };

    window.onload = function() {
      parent.postMessage(authResponse,"*");
    };
  </script>
</head>
<body>
  Child iFrame....
</body>
</html>