2017-12-05 23 views
8

Làm việc với một dự án, nơi sử dụng cookie để nhận dạng người dùng.Trình duyệt không gửi cookie trong yêu cầu tiếp theo

Khi dùng đến, nó gọi dịch vụ (trong đó đang chạy trong localhost) và các dịch vụ gửi cookie với tiêu đề phản ứng trông giống như dưới đây:

curl 'http://127.0.0.1:8000/api/v1.0/tracking' -X OPTIONS -H 'Access-Control-Request-Method: POST' -H 'Origin: http://local.com:8080' -H 'Access-Control-Request-Headers: content-type,x-forwarded-for' --compressed 

Tiêu đề phản ứng trông giống như dưới đây:

HTTP/1.1 200 OK 
Connection: keep-alive 
Keep-Alive: 60 
Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, x-forwarded-for 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: POST, PATCH, GET 
Content-Length: 0 
Content-Type: text/plain; charset=utf-8 
Set-Cookie: id=random_id_123_123; expires=Wed, 06-Dec-2017 10:57:36 GMT; Domain=.local.com; Path=/ 

Và sau một hành động người dùng cụ thể, các ứng dụng đang gửi yêu cầu API sau:

curl 'http://127.0.0.1:8000/api/v1.0/tracking?event=video_added&user_id=123123123' -H 'Origin: http://local.com:8080' -H 'Accept: */*' -H 'Referer: http://local.com:8080/' -H 'Connection: keep-alive' --compressed 

Các tiêu đề yêu cầu cho các yêu cầu ở trên trông giống như dưới đây:

GET api/v1.0/tracking?event=video_added&user_id=123123123 HTTP/1.1 
Host: 127.0.0.1:8000 
Connection: keep-alive 
Accept: */* 
Origin: http://local.com:8080 
User-Agent: My user agent 
Referer: http://local.com:8080/ 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-US,en;q=0.9 

tôi đã mong cookie (random_id_123_123) để được nhận với yêu cầu đầu tiên là tiêu đề phản ứng sẽ là tiêu đề yêu cầu cho yêu cầu thứ hai.

Trang web đang chạy trên: http://local.com:8080 (thực sự chạy trên máy cục bộ và cấu hình vhost của tôi trỏ 127.0.0.1 local.com) và đang được phục vụ bởi python SimpleHTTPServer.

Dịch vụ phụ trợ đang đặt cookie đang chạy trên cổng 8000 trong máy chủ cục bộ. Dường như tôi đã bỏ lỡ điều gì đó trong quá trình triển khai. Cái gì thế?

Chỉnh sửa: Đây là code.

+0

Nó muốn được thực sự khó khăn đối với chúng tôi để nói * nếu bạn không gửi bất kỳ mã * –

+0

@MatiasCicero Tôi đã thêm liên kết mã. –

Trả lời

5

Vấn đề của bạn là cookie chỉ được gửi dựa trên tên miền. Mã của bạn có

var settings = { 
    "crossDomain": true, 
    "url": "http://127.0.0.1:8000/api/v1.0/tracking?event=video_added&tracking_id=123123123", 
    "method": "GET", 

} 

Url là 127.0.0.1:8000 và nó phải local.com:8000 nếu bạn muốn cookie để được thông qua.

+0

Đã chỉnh sửa câu hỏi. Dịch vụ đang đặt cookie đang chạy trên 127.0.0.1:8000 và trang web đang gọi API đang chạy trên 127.0.0.1:8080. –

+0

Xem chủ đề này https://stackoverflow.com/questions/1612177/are-http-cookies-port-specific. Nếu bạn đang duyệt nó dưới dạng 'local.com: 8080' trong trình duyệt thì api cũng nên sử dụng 'local.com: 8000' vì ngay cả khi' local.com' trỏ đến '127.0.0.1', họ không giống nhau khi nói đến chia sẻ cookie –

+0

Ngoài ra nếu bạn muốn bạn thậm chí có thể xóa 'response.cookies [" id "] [" domain "] =" .local.com "' và điều đó cũng sẽ giúp bạn . –

1

Lần cuối cùng tôi chọn, curl không bật cookie theo mặc định.

Để làm như vậy, bạn sẽ cần phải:

  • Sử dụng các tham số -b/path/to/cookiejar để đọc các tập tin cookie.
  • Sử dụng tham số -c/path/to/cookiejar để ghi cookie.

Vì vậy, yêu cầu của bạn nên trở thành:

curl -c cookiejar 'http://127.0.0.1:8000/api/v1.0/tracking' \ 
-X OPTIONS -H 'Access-Control-Request-Method: POST' \ 
-H 'Origin: http://local.com:8080' \ 
-H 'Access-Control-Request-Headers: content-type,x-forwarded-for' \ 
--compressed 

Và:

curl -b cookiejar 'http://127.0.0.1:8000/api/v1.0/tracking?event=video_added&user_id=123123123' \ 
-H 'Origin: http://local.com:8080' \ 
-H 'Accept: */*' \ 
-H 'Referer: http://local.com:8080/' \ 
-H 'Connection: keep-alive' --compressed 
Các vấn đề liên quan