2012-04-19 4 views
40

Tôi biết điều này đã được yêu cầu trước ở nhiều hình thức khác nhau, nhưng dường như tôi không thể giải quyết được vấn đề. Tôi đã thử sử dụng cả jQuery và API JS gốc để thực hiện các yêu cầu Ajax.Cookie HTTP và các yêu cầu Ajax qua HTTPS

tình hình của tôi là những sản phẩm sau (xem sơ đồ kèm theo):

  1. trình duyệt làm cho HTTP yêu cầu
  2. Server đáp ứng và thiết lập Cookie dai dẳng
  3. trình duyệt làm cho HTTP yêu cầu Ajax, Cookie là có ổn
  4. Máy chủ phản hồi như mong đợi, cập nhật Cookie
  5. Trình duyệt thực hiện yêu cầu HTTPS Ajax, Cookie không còn ở đó nữa (?!)
  6. Server cung cấp cho "mặc định" phản ứng, vì không có Cookie (hành vi ngoài ý muốn)

Trước khi bất cứ ai bắt đầu một bài thuyết trình về yêu cầu miền chéo cho tôi nêu một vài điều:

  • Tôi biết rằng đây là yêu cầu tên miền chéo (giao thức khác) và đó là lý do tại sao Máy chủ đặt tiêu đề Access-Control-Allow-Origin trong phản hồi (và tôi đang sử dụng Chrome và Firefox, cả hai đều hỗ trợ CORS)
  • Điều tôi cũng biết rằng cookie HTTP phải được quản lý qua HTTPS (xem here) s ince host là giống nhau
  • (EDIT) Cookie được đặt đúng cho miền chung (ví dụ: .domain.ext) và cả cờ HttpOnly lẫn cờ an toàn đều không được đặt

Vì vậy, tại sao, tại sao trình duyệt không chuyển cookie khi thực hiện cuộc gọi HTTPS Ajax? Bất kỳ ý tưởng? Tôi sắp mất trí ...

 +-----------+ HTTP Request  +-----------+ 
    |Browser |+---------------->|Server  | 
    +-----------+     +-----------+ 

        HTTP Response 
        <----------------+ 
        Set-cookie 

        Ajax HTTP Req. 
        +----------------> 
        Cookie (OK) 

        HTTP Response 
        <----------------+ 
        Set-cookie (OK) 

        Ajax HTTPS Req. 
        +----------------> 
        No Cookie (!!!) 
+0

Capture HTTP yêu cầu bãi và kiểm tra nếu có của 'secure' và' http-only 'flags được đặt trong câu lệnh' Set-Cookie'. Điều đó ít nhất sẽ là một nơi tốt để bắt đầu. – dpq

+0

Không được đặt. – NeXuS

+0

http://stackoverflow.com/questions/5441836/jquery-cookie-values-not-maintained-while-moving-from-http-to-https trông như thế này là một hạn chế có chủ ý. – dpq

Trả lời

66

Ok, tìm ra giải pháp cho vấn đề về cookie.

Xem XHR specs, jQuery docsStackOverflow.

Giải pháp để cookie được gửi khi chuyển giao thức và/hoặc tên miền phụ là đặt thuộc tính withCredentials thành true.

Ví dụ: (sử dụng jQuery)

$.ajax({ 
    /* Setup the call */ 
    xhrFields: { 
    withCredentials: true 
    } 
}); 
+2

Tuyệt vời. Bạn tìm thấy câu trả lời cho mình. Cám ơn vì đã chia sẻ. Rất nhiều bài đăng khi mọi người tìm thấy câu trả lời và không chia sẻ. Kudos NeXuS. – FernandoZ

+0

Thật không may tôi đã không thể làm cho nó hoạt động dù sao ...: D – NeXuS

+0

cảm ơn, điều này đã làm việc cho tôi sau 2 ngày cố gắng tìm ra lý do tại sao –

0

Document.cookie và Ajax Yêu cầu không chia sẻ cookie. Nếu không, ajax không thể truy cập cookie từ document.cookie hoặc tiêu đề phản hồi. Chúng chỉ có thể được kiểm soát bởi miền từ xa.

Nếu bạn lần đầu tiên nhận được phản hồi bao gồm cookie từ máy chủ bởi ajax, Vì bạn có thể yêu cầu liên lạc ajax với cookie đến máy chủ.

Đối với trường hợp này, bạn viết như dưới đây mã (jQuery)

$.jajx({ 
     xhrFields : { 
      withCredentials : true 
     } 
    }); 

Xem this articledemo