Làm thế nào để sử dụng cURL để gửi Cookies?


296

Tôi đọc rằng Gửi cookie với curl hoạt động, nhưng không phải cho tôi.

Tôi có một RESTđiểm cuối là:

class LoginResource(restful.Resource):
    def get(self):
        print(session)
        if 'USER_TOKEN' in session:
            return 'OK'
        return 'not authorized', 401

Khi tôi cố gắng truy cập như:

curl -v -b ~/Downloads/cookies.txt -c ~/Downloads/cookies.txt http://127.0.0.1:5000/
* About to connect() to 127.0.0.1 port 5000 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.27.0
> Host: 127.0.0.1:5000
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 401 UNAUTHORIZED
< Content-Type: application/json
< Content-Length: 16
< Server: Werkzeug/0.8.3 Python/2.7.2
< Date: Sun, 14 Apr 2013 04:45:45 GMT
<
* Closing connection #0
"not authorized"%

Tôi ~/Downloads/cookies.txtđang ở đâu:

cat ~/Downloads/cookies.txt
USER_TOKEN=in

và máy chủ không nhận được gì:

127.0.0.1 - - [13/Apr/2013 21:43:52] "GET / HTTP/1.1" 401 -
127.0.0.1 - - [13/Apr/2013 21:45:30] "GET / HTTP/1.1" 401 -
<SecureCookieSession {}>
<SecureCookieSession {}>
127.0.0.1 - - [13/Apr/2013 21:45:45] "GET / HTTP/1.1" 401 -

Tôi đang thiếu cái gì?


Tôi nghĩ rằng việc thêm -ctùy chọn curlsẽ sử dụng tệp cookie của bạn làm tệp cookie đầu ra, đây có thể không phải là điều bạn muốn.
Máy xay sinh tố

một trong những -btùy chọn một mình cũng không hoạt động, đưa ra lỗi tương tự :(
daydreamer

định dạng của -btệp cookie không chỉ var=value, nó phải giống với định dạng của tệp cookie được viết bằng cách sử dụng -c. Đến một trang web gửi cookie với tùy chọn này và xem tệp kết quả.
Barmar

-B cookie_file phải ở định dạng Netscape / Mozilla hoặc các tiêu đề HTTP đơn giản. Dưới đây là ví dụ về các tiêu đề http đơn giản: Set-cookie: cookie_name = cookie_value; Đây là mức tối thiểu. Đừng quên dấu chấm phẩy ở cuối.
Alex

Câu trả lời:


492

Điều này làm việc cho tôi:

curl -v --cookie "USER_TOKEN=Yes" http://127.0.0.1:5000/

Tôi có thể thấy giá trị trong phụ trợ bằng cách sử dụng

print request.cookies

17
Miễn là bạn không bao giờ, bao giờ có boolean cho mã thông báo người dùng làm cookie, với điều kiện là họ chỉ có thể tự xác thực mà không cần đăng nhập theo cách đó.
matts1

15
Theo trang man, đối với tùy chọn -b, --cookie, ví dụ: curl -b <file-or-pairs>nếu đối số là một chuỗi có '='ký hiệu, thì nó sẽ được thông qua, nếu không, nó được coi là tên tệp để đọc cookie từ đó.
ryenus

61
nhiều cookie có thể được đặt bằng dấu chấm phẩy--cookie "key1=val1;key2=val2;..."

Tại sao không có câu trả lời này trên đầu tôi tự hỏi ... plugin sắp xếp câu trả lời bất cứ ai?
iomv

91

Bạn có thể tham khảo https://curl.haxx.se/docs/http-cookies.html để biết hướng dẫn đầy đủ về cách làm việc với cookie. Bạn có thể dùng

curl -c /path/to/cookiefile http://yourhost/

để ghi vào tập tin cookie và khởi động công cụ và để sử dụng cookie, bạn có thể sử dụng

curl -b /path/to/cookiefile  http://yourhost/

để đọc cookie từ và khởi động công cụ cookie hoặc nếu không phải là tệp, nó sẽ truyền vào chuỗi đã cho.


1
IMO bạn không tăng cường trên doc chính thức đó là rõ ràng như bùn - bên cạnh quá tải của -blá cờ là những gì khác cần thiết giữa -c& -bcả hai đều khởi động động cơ và trỏ đến một tập tin cookie?
nhed

4
@nhed -c ghi vào tập tin cookie, -bđọc từ nó. Vì vậy, khi gửi thông tin đăng nhập cho một hình thức đăng nhập, bạn sẽ chỉ định -cghi cookie kết quả vào một tệp, sau đó bạn sẽ sử dụng -bđể đọc và đưa cookie vào yêu cầu tiếp theo của bạn.
Madbreaks

26
Hoặc làm curl -b cookiefile -c cookiefile https://yourhost/để đọc ghi vào cùng một cửa hàng cookie như trình duyệt.
LinuxDiscipl

38

Bạn đang sử dụng một định dạng sai trong tập tin cookie của bạn. Như tài liệu curl tuyên bố, nó sử dụng định dạng tệp cookie Netscape cũ, khác với định dạng được sử dụng bởi các trình duyệt web. Nếu bạn cần tạo một tệp cookie curl bằng tay, bài đăng này sẽ giúp bạn. Trong ví dụ của bạn, tập tin nên chứa dòng sau

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

có 7 trường được phân tách bằng TAB có nghĩa là miền , đuôi , đường dẫn , bảo mật , hết hạn , tên , giá trị .


2
Vâng, đây là định dạng cookie cURL. Đây là TABS và không SPACES.
m3nda

4
Điều này nên được đánh dấu là câu trả lời chính thức, vì điều này thực sự giải quyết vấn đề tại sao thiết lập của @ daydreamer không thành công.
Valber

0

Nếu bạn đã thực hiện yêu cầu đó trong ứng dụng của mình và thấy nó đã đăng nhập vào Google Dev Tools, bạn có thể sử dụng lệnh sao chép cURL từ menu ngữ cảnh khi nhấp chuột phải vào yêu cầu trong tab mạng. Sao chép -> Sao chép dưới dạng cURL. Nó sẽ chứa tất cả các tiêu đề, cookie, vv ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.