【问题标题】:Safari Ajax cors request not following redirectSafari Ajax cors 请求未遵循重定向
【发布时间】:2013-02-12 03:35:41
【问题描述】:

基本上,我有一个登录表单,一旦通过身份验证,它就会启动 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

最后一个 URL 永远不会被命中。在 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 中,我看到了请求,但像死了一样

我使用的是 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

【问题讨论】:

    标签: jquery ajax safari cors


    【解决方案1】:

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

    【讨论】:

    • “Apple 声称这是 HTML 规范的编写方式”你能引用你的来源吗?
    • 很抱歉这么晚才回复。我正在与之交谈的一位工程师在 webkit 上工作。但它确实是 HTML5 规范。将请求 Origin 设置为 null 是规范 w3.org/TR/cors 的一部分,请参阅第 7.1.7 节的第 6 步。
    • 我知道 JSONP 不是您的选择,但对于遇到此问题的其他人...我可以确认它确实适用于跨域的多个重定向的 Safari。
    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 2019-10-27
    • 2017-02-16
    • 2020-04-17
    • 2017-06-26
    • 2011-02-04
    • 2019-04-09
    • 2012-07-27
    相关资源
    最近更新 更多