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