Internet Explorer ajax请求未经过身份验证

时间:2011-09-21 13:26:00

标签: ajax facebook internet-explorer authentication iframe

我的应用程序工作流程是这样的:用户经过身份验证,他们启动游戏,一段时间后我发出ajax请求获取一些数据,但此请求也经过身份验证。

问题在于,当第一次发出ajax请求时,Internet Explorer会将用户视为未经身份验证,并强制重定向,一切正常。

仅在Internet Explorer上出现此问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您的应用程序在IFRAME中运行,那么您应该设置P3P标头以启用Cookie。

您应该在第一个响应中发送一个特殊的HTTP标头:

P3P: CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV"

这应解决IE的问题,但您可能会在Chrome和Safari中遇到同样的问题。它仅在用户首次访问您的应用时显示。您可以使用浏览器清理功能清除浏览器中的所有个人信息来模拟它。

我通过将初始signed_request属性存储到Javascript变量并将其作为附加HTTP头发送到所有AJAX请求中来解决此问题(如果使用jQuery,则可以)。此外,我为所有链接和表单添加了相同的属性。

示例代码:

var signed_request = '...'; // My signed request goes here

...

function signedUrl(url){
  var url_parts = url.split('#', 2);

  var new_url = url_parts[0] + (url_parts[0].indexOf('?') == -1 ? '?' : '&') + 'stored_signed_request=' + signed_request;

  if(url_parts.length == 2) {
    new_url = new_url + '#' + url_parts[1];
  }

  return new_url;
}

...

  if(document.cookie.indexOf('fbsr_') == -1){
    $('a').live('click', function(){
      var href = $(this).attr('href') || '';

      if(href !== ''){
        $(this).attr('href', signedUrl(href));
      }
    });

    $('form').live('submit', function(){
      $(this).append('<input type="hidden" name="stored_signed_request" value="' + signed_request + '">');
    });

    $.ajaxSetup({
      beforeSend : function(request){
        request.setRequestHeader('signed-request', signed_request);
      }
    });
  }