2013-02-26 28 views
6

Về cơ bản, tôi có biểu mẫu đăng nhập đã được xác thực khi bắt đầu quy trình Oauth2. Mà hoạt động hoàn hảo cho đến khi nó đã làm chuyển hướng cuối cùng mà được các thẻ truy cập. Luồng đăng nhập như sau POST tới /user/login chuyển hướng đến /user/oauth/auth rồi chuyển hướng đến chuyển hướng Oauth_uri /user/oauth/redirect. Redirect_uri không bao giờ xảy ra và yêu cầu không bao giờ chạm vào máy chủ.Yêu cầu về trình duyệt Safari Ajax không theo chuyển hướng

Nếu tôi nhấn chuyển hướng đó bằng cách sử dụng một yêu cầu Ajax, cors hoạt động tốt và tôi nhận được phản hồi mong đợi nó dường như chỉ xảy ra nếu tôi chuyển hướng hai lần.

Máy chủ cho thấy những phản ứng

[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 cuối cùng không bao giờ có được hit. Trong Chrome, IE, FF dòng chảy là như nhau ngoại trừ server thấy yêu cầu

[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 

Trong Inspector web tôi thấy yêu cầu nhưng chết như một

enter image description here

Tôi đang sử dụng Jquery 1.9 và đây là yêu cầu ajax (cấp tôi đã có tất cả các tùy chọn dưới ánh mặt trời ở đây để thử và làm cho nó làm việc.)

$.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 không phải là một lựa chọn như p ban đầu ost được gửi qua https và phải là một yêu cầu POST. Một lần nữa tất cả các trình duyệt khác bao gồm IE đang hoạt động tốt, nó sẽ phản ứng thành công.

Safari kích hoạt mã trạng thái 0 và lỗi là lỗi chính sách gốc cổ điển nhưng chuyển hướng uri hoạt động trong yêu cầu ajax chuẩn bỏ qua thông tin đăng nhập. Tôi nghi ngờ đó là một vấn đề kiểm soát truy cập bởi vì cuộc gọi sẽ hoạt động nếu Safari chỉ bắn nó.

Tôi chắc chắn rằng nó có liên quan đến các tiêu đề yêu cầu trên chuyển hướng và Safari đang dừng yêu cầu. Vào ngày đầu tiên thành công 302 họ trông như thế này

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

Nhưng trên uri chuyển hướng họ trông như thế này (có ý nghĩa là tại sao nó không gây ra không có tiêu đề kiểm soát truy cập được gửi nhưng tại sao ??)

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 

Trả lời

5

Có vẻ như đây là một điều Safari, nó sẽ chỉ theo chuyển hướng đầu tiên. Apple tuyên bố rằng đây là cách HTML spec được viết. Vì vậy .... Đã phải làm lại luồng của tôi để không chuyển hướng trên /user/login và bắt đầu quá trình oauth ngay lập tức.

+1

"Apple tuyên bố rằng đây là cách thông số HTML được viết" Bạn có thể trích dẫn nguồn của mình không? – hrdwdmrbl

+0

Xin lỗi vì câu trả lời thực sự muộn này. Đó là một kỹ sư tôi đã nói chuyện với công việc đó trên webkit. Nhưng nó thực sự là thông số HTML5. Đặt yêu cầu Xuất xứ thành null là một phần của thông số http://www.w3.org/TR/cors/ Xem bước 6 của phần 7.1.7. –

+0

Tôi hiểu rằng JSONP không phải là một lựa chọn cho bạn, nhưng đối với những người khác gặp phải điều này ... Tôi có thể xác nhận rằng JSONP hoạt động trên Safari với nhiều chuyển hướng trên các tên miền. – james

Các vấn đề liên quan