2012-01-14 45 views
47

Tôi có một tên miền chéo AJAX GET được định trước thành công, nhưng cookie không được đính kèm với yêu cầu GET. Khi người dùng nhấp vào nút đăng nhập, POST được thực hiện để đăng nhập người dùng vào, hoạt động chính xác với miền chéo. JavaScript là:Yêu cầu CORS - tại sao cookie không được gửi?

 $.ajax(signin_url, { 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      data: JSON.stringify(credentials), 
      success: function(data, status, xhr) { 
       signInSuccess(); 
      }, 
      error: function(xhr, status, error) { 
       signInFailure(); 
      }, 
      beforeSend: function(xhr) { 
       xhr.withCredentials = true 
      } 
     }); 

các tiêu đề phản ứng bao gồm một cookie:

Set-Cookie:user_token=snippysnipsnip; path=/; expires=Wed, 14-Jan-2032 16:16:49 GMT 

Nếu đăng nhập thành công, một GET yêu cầu Javascript được thực hiện để có được thông tin chi tiết của người dùng hiện tại:

function signInSuccess() { 
    $.ajax(current_user_url, { 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     success: function(data, status, xhr) { 
      displayWelcomeMessage(); 
     }, 
     beforeSend: function(xhr) { 
      xhr.withCredentials = true; 
     } 
    }); 
} 

Các tiêu đề liên quan đến CORS được trả về từ yêu cầu OPTIONS của Chrome là:

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:X-Requested-With, X-Prototype-Version, Content-Type, Origin, Allow 
Access-Control-Allow-Methods:POST, GET, OPTIONS 
Access-Control-Allow-Origin:http://192.168.0.5 
Access-Control-Max-Age:1728000 

Tuy nhiên, không có cookie nào được gửi trên yêu cầu GET.

Trả lời

65

Vấn đề là với jQuery gọi - có vẻ như từ 1,5 withCredentials nên được quy định như:

 $.ajax("http://localhost:3000/users/current", { 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      success: function(data, status, xhr) { 
       hideAllContent(); 
       $("#sign_out_menu_item").show(); 
       $("#sign_in_menu_item").hide(); 
       $("#welcome").text("Welcome " + data["username"] + "!"); 
       $("#welcome").show(); 
      }, 
      xhrFields: { 
       withCredentials: true 
      }, 
      crossDomain: true 
     }); 
+6

đã dành 4 giờ vào việc này để làm việc. Ước gì tôi đã nhìn thấy bài đăng này trước đây. Cảm ơn! – ChrisRich

+0

PUT/OPTIONS dường như không hoạt động theo cùng một cách. Tại sao cookie được gửi cho GET/POST nhưng không gửi yêu cầu OPTION prefuts PUT? –

+2

Cookie không hoạt động (không được đặt) trên máy chủ cục bộ. Thay vào đó, hãy sử dụng tên miền dựa trên ip (ví dụ: '127.0.0.1') nếu bạn cần sử dụng cookie cục bộ. – Dziamid

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