2012-01-13 45 views
15

Ứng dụng javascript chạy trên 10.0.0.1 cố gắng xác thực người dùng đó bằng các cuộc gọi ajax nhiều miền.Giữ cookie sau khi yêu cầu ajax tên miền chéo

Yêu cầu trông giống như:

function test(again){ 
    $.ajax({ 
    type: 'GET', 
    url: 'http://example.com/userinfo', 
    dataType: 'json', 
    success: function(userinfo){ 
     if(again) 
     test(false);}});} 
test(true); 

Câu trả lời đầu tiên từ máy chủ cố gắng thiết lập một cookie:

Access-control-allow-origin:http://10.0.0.1 
Set-Cookie:PHPSESSID=uuj599r4k1ohp48f1poobil665; expires=Sat, 28-Jan-2012 17:10:40 GMT; path=/ 

Nhưng yêu cầu thứ hai không bao gồm cookie này, cũng không phải làm bất cứ ajax khác yêu cầu đến tên miền đó.

Tôi không cố gắng đọc cookie cho tên miền khác, tôi chỉ muốn ứng dụng trên miền khác có thể đặt và đọc cookie của riêng nó.

Điều này có khả thi không?

Tôi đã thử nghiệm trong Chrome và Firefox 9.

Trả lời

1

Không, cookie không thể được chia sẻ tên miền chéo. Các same origin policy có thể được phá vỡ cho các cuộc gọi AJAX sử dụng các tiêu đề Access-Control-* giả định trình duyệt hỗ trợ chúng, nhưng đối với cookie không có cách nào.

+1

Cảm ơn thông tin của bạn. Tuy nhiên tôi không cố gắng chia sẻ cookie chéo tên miền. Tôi chỉ muốn chia sẻ cookie giữa các yêu cầu đến cùng một miền. Nếu đó là những gì bạn có ý nghĩa, xin vui lòng làm rõ. – AtnNn

+0

@ itnnn rằng trường hợp nó sẽ hoạt động, bạn có chắc chắn 100% không? Đảm bảo rằng yêu cầu tiếp theo của bạn là chính xác cùng một tên miền và không phải là tên miền phụ hoặc siêu tên miền. – DaveRandom

+0

Nếu bạn nhìn vào mã của tôi, bạn sẽ thấy rằng đó là yêu cầu chính xác, và không có điều kiện chủng tộc. – AtnNn

0

+ Darin Dimitrov nghi ngờ rằng "cookie không được lưu bởi trình duyệt vì cookie đến từ một tên miền khác so với trang lưu trữ trang có nguồn gốc của cuộc gọi này".

Tuy nhiên, cookie được đặt như mong muốn khi sử dụng JSONP, nhưng JSONP chỉ dành cho các yêu cầu GET.

Giải pháp của tôi là để lấy cookie (một phiên id PHP) bằng cách load file php sau đây trong một <script>:

<? echo $_GET['callback'] . '("' . session_id() . '")'; ?> 

Và để vượt qua các phiên id như là một biến yêu cầu trong tất cả các POST cross-domain yêu cầu.

10

Miễn là bạn đang sử dụng trình duyệt hỗ trợ CORS, cookie trên yêu cầu AJAX sẽ hoạt động. Nhưng bạn phải đặt withCredentials trên số XMLHttpRequest thành true.

Xem: The withCredentials attribute

tôi không sử dụng JQuery nhưng đây là một câu hỏi mà những giao dịch đặc biệt với thiết withCredentials qua JQuery.

Sending credentials with cross-domain posts?

+1

Để làm rõ, tài liệu tại [developer.mozilla.org] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) nêu rõ điều này về cách sử dụng các yêu cầu có bằng chứng xác thực: "khi trả lời một yêu cầu được chứng nhận, máy chủ phải chỉ định miền và không thể sử dụng tính năng gắn thẻ tự nhiên. " Vì vậy, hãy đảm bảo tiêu đề 'Access-Control-Allow-Origin' của bạn chứa tên miền thực tế nơi yêu cầu đến từ và không phải là' * '. –

11

máy chủ nên đặt tiêu đề:

response.Headers.Add("Access-Control-Allow-Credentials", "true"); 

khách hàng thiết lập để:

xhrFields: { 
    withCredentials: true 
} 
+0

Không nên đặt câu trả lời là 'response.Headers.Add (" Access-Control-Allow-Credentials "," true ");'? – bounav

+0

Có, tôi đã xác định trường const. – Teddy

+0

Điều này đã cứu ngày của tôi, cảm ơn! –

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