Safari Ajax cors请求不遵循重定向

时间:2013-02-26 15:43:24

标签: jquery ajax safari cors

基本上,我有一个登录表单,一旦通过身份验证就会启动Oauth2进程。哪个工作完美无缺,直到它必须进行最终重定向才能获得访问权限。登录流程如下:POST /user/login重定向到/user/oauth/auth,然后重定向到Oauth redirect_uri /user/oauth/redirect。 redirect_uri永远不会发生,请求永远不会到达服务器。

如果我使用Ajax请求点击该重定向,那么cors工作正常,我得到了预期的响应,如果我重定向两次,它似乎就会发生。

服务器显示这些回复

[I 130226 10:16:38 web:1462] 302 POST /user/login (192.168.1.5) 156.01ms  (Session cookies set fine)
[I 130226 10:16:38 web:1462] 200 OPTIONS /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 1.86ms
302 GET /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 8.58ms

最后一个网址永远不会受到影响。在Chrome,IE,FF中,除了服务器看到请求之外,流程是相同的

[I 130226 10:16:38 web:1462] 302 POST /user/login (192.168.1.5) 156.01ms  
[I 130226 10:16:38 web:1462] 200 OPTIONS /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 1.86ms
302 GET /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 8.58ms
[I 130226 10:27:12 web:1462] 200 GET /user/oauth/redirect/code?code=57497058fbbf6003310ea22d3902ac67 (192.168.1.5) 0.54ms

在Web Inspector中,我看到了请求,但却像

一样死掉

enter image description here

我正在使用Jquery 1.9,这里是ajax请求(我已经在这里获得了阳光下的所有选项以尝试使其工作。)

$.ajax({
    type: "POST",
    url: reqUrl,
    data: data,
    dataType: "json",
    success: function(data, textStatus) {
            console.log(data);
            alert('logged in');

    },
    error: function(e){
        console.log(e);
    },
    complete: function(request, status) {
        console.log("headers=" + request.getAllResponseHeaders());
    },
    statusCode: {
    200: function(data) {
        console.log('yup we got it.')
    }
  },
  xhrFields: {
    withCredentials: true
  },
  crossDomain: true,
  async:true
});

JSONP不是一个选项,因为初始帖子是通过https发送的,必须是POST请求。包括IE在内的所有其他浏览器都工作得很好,它会触发成功响应。

Safari会触发Statuscode 0和错误,这是经典的Origin策略错误,但重定向uri在绕过登录的标准ajax请求中工作。我怀疑它是一个访问控制问题,因为如果Safari只是触发它,那么调用就会起作用。

我很确定它与重定向上的请求标头有关,Safari正在停止请求。在第一次成功的302上,他们看起来像这样

Access-Control-Request-Method: GET
Origin: http://192.168.1.5:9090
Access-Control-Request-Headers: origin, accept-encoding, accept-language

但是在重定向uri上它们看起来像这样(这对于它为什么失败是有道理的,因为没有发送访问控制头但是为什么?)

Origin: http://192.168.1.5:9090
Accept-Encoding: gzip, deflate
Accept-Language: en-us
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17
Accept: */*
Referer: http://192.168.1.5:9090/login

1 个答案:

答案 0 :(得分:5)

看起来这是一个Safari的东西,它只会遵循第一个重定向。 Apple声称这是HTML规范的编写方式。所以......不得不重新修改我的流程,不要重定向/user/login并立即启动oauth流程。