Bagaimana cara menggunakan CURL untuk mengirim Cookie?

296

Saya membaca bahwa Kirim cookie dengan karya ikal , tetapi tidak untuk saya.

Saya memiliki RESTtitik akhir sebagai:

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

Ketika saya mencoba mengakses sebagai:

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"%

Dimana saya ~/Downloads/cookies.txtberada:

cat ~/Downloads/cookies.txt
USER_TOKEN=in

dan server tidak menerima apa pun:

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 -

Apa yang saya lewatkan?

pelamun
sumber
Saya pikir menambahkan -copsi memberitahu curluntuk menggunakan file cookie Anda sebagai toples cookie output, yang mungkin bukan yang Anda inginkan.
Blender
satu dengan -bopsi saja juga tidak berfungsi, memberikan kesalahan yang sama :(
daydreamer
format -bfile cookie tidak hanya var=value, itu harus sama dengan format toples cookie yang ditulis menggunakan -c. Pergi ke situs yang mengirim cookie dengan opsi ini, dan lihat file yang dihasilkan.
Barmar
-B cookie_file harus dalam format Netscape / Mozilla atau header HTTP biasa. Berikut adalah contoh header http biasa: Set-cookie: cookie_name = cookie_value; Ini adalah minimum. Jangan lupa titik koma di bagian akhir.
Alex

Jawaban:

492

Ini bekerja untuk saya:

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

Saya bisa melihat nilai di backend menggunakan

print request.cookies
pelamun
sumber
17
Selama Anda tidak pernah, pernah memiliki boolean untuk token pengguna sebagai cookie, mengingat bahwa mereka dapat mengotentikasi diri mereka sendiri tanpa masuk dengan cara itu.
matts1
15
Menurut halaman manual, untuk opsi -b, --cookie, misalnya curl -b <file-or-pairs>, jika argumennya adalah string yang memiliki '='simbol, ia dilewatkan begitu saja, jika tidak maka diperlakukan sebagai nama file untuk membaca cookie dari.
ryenus
61
beberapa cookie dapat disetel dengan titik koma--cookie "key1=val1;key2=val2;..."
Mengapa jawaban ini tidak di atas saya bertanya-tanya ... Plugin sortir-jawaban siapa?
iomv
91

Anda dapat merujuk ke https://curl.haxx.se/docs/http-cookies.html untuk tutorial lengkap tentang cara bekerja dengan cookie. Kamu bisa memakai

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

untuk menulis ke file cookie dan memulai mesin dan menggunakan cookie yang dapat Anda gunakan

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

untuk membaca cookie dari dan memulai mesin cookie, atau jika bukan file itu akan melewati string yang diberikan.

Moeen M
sumber
1
IMO Anda tidak meningkatkan pada doc resmi yang jelas sebagai lumpur - di samping overloading dari -bbendera apa diff penting antara -c& -bmereka berdua mulai mesin dan arahkan ke file cookie?
nhed
4
@nhed -c menulis ke file cookie, -bmembaca dari itu. Jadi ketika mengirim kredensial untuk formulir login Anda akan menentukan -cuntuk menulis cookie yang dihasilkan ke file, maka Anda akan gunakan -buntuk membaca dari dan memasukkan cookie dalam permintaan Anda berikutnya.
Madbreaks
26
Atau lakukan curl -b cookiefile -c cookiefile https://yourhost/untuk membaca dan menulis ke toko cookie yang sama seperti yang dilakukan browser.
LinuxDisciple
38

Anda menggunakan format yang salah dalam file cookie Anda. Seperti yang dinyatakan oleh dokumentasi curl , ia menggunakan format file cookie Netscape lama, yang berbeda dari format yang digunakan oleh browser web. Jika Anda perlu membuat file cookie keriting secara manual, posting ini akan membantu Anda. Dalam contoh Anda file tersebut harus berisi baris berikut

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

memiliki 7 bidang yang dipisahkan TAB yang berarti domain , tailmatch , jalur , aman , kedaluwarsa , nama , nilai .

yurloc
sumber
2
Ya, ini adalah format cookie cURL. Ini adalah TABS dan bukan RUANG.
m3nda
4
Ini harus ditandai sebagai jawaban resmi, karena ini benar-benar menjelaskan mengapa pengaturan @ daydreamer gagal.
Valber
0

Jika Anda telah membuat permintaan itu di aplikasi Anda, dan melihatnya masuk di Google Dev Tools, Anda dapat menggunakan perintah salin cURL dari menu konteks saat mengklik kanan permintaan di tab jaringan. Salin -> Salin sebagai CURL. Ini akan berisi semua tajuk, cookie, dll.

Balik
sumber