Wie verwende ich cURL, um Cookies zu senden?

296

Ich habe gelesen, dass das Senden von Cookies mit Locken funktioniert, aber nicht für mich.

Ich habe einen RESTEndpunkt als:

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

Wenn ich versuche, auf Folgendes zuzugreifen:

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

Wo mein ~/Downloads/cookies.txtist:

cat ~/Downloads/cookies.txt
USER_TOKEN=in

und der Server erhält nichts:

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 -

Was fehlt mir?

Tagträumer
quelle
Ich denke, das Hinzufügen der -cOption weist Sie curlan, Ihre Cookie-Datei als Ausgabe-Cookie-Jar zu verwenden, was möglicherweise nicht das ist, was Sie wollen.
Blender
die mit -bOption allein funktioniert auch nicht, was den gleichen Fehler ergibt :(
Tagträumer
Das Format der -bCookie-Datei ist nicht nur var=valuedas gleiche, es sollte auch das Format des Cookies sein, mit dem geschrieben wurde -c. Gehen Sie zu einer Site, die mit dieser Option Cookies sendet, und sehen Sie sich die resultierende Datei an.
Barmar
Die -b-Cookie-Datei sollte entweder im Netscape / Mozilla-Format oder in einfachen HTTP-Headern vorliegen. Hier ist ein Beispiel für einfache http-Header: Set-cookie: cookie_name = cookie_value; Dies ist das absolute Minimum. Vergessen Sie nicht das Semikolon am Ende.
Alex

Antworten:

492

Das hat bei mir funktioniert:

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

Ich konnte den Wert im Backend mit sehen

print request.cookies
Tagträumer
quelle
17
Solange Sie niemals einen Booleschen Wert für ein Benutzertoken als Cookie haben, können diese sich nur authentifizieren, ohne sich auf diese Weise anzumelden.
Matts1
15
Laut der Manpage wird das Argument für eine Option -b, --cookie, z. B. curl -b <file-or-pairs>wenn es sich um eine Zeichenfolge mit dem '='Symbol handelt, unverändert übergeben, andernfalls wird es als Dateiname behandelt, aus dem Cookies gelesen werden sollen.
Ryenus
61
--cookie "key1=val1;key2=val2;..."
Warum ist diese Antwort nicht oben? Ich frage mich, ob jemand ein Plugin zum Sortieren von Antworten hat.
iomv
91

Unter https://curl.haxx.se/docs/http-cookies.html finden Sie eine vollständige Anleitung zum Umgang mit Cookies. Sie können verwenden

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

um in eine Cookie-Datei zu schreiben und die Engine zu starten und Cookies zu verwenden, die Sie verwenden können

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

Um Cookies zu lesen und die Cookie-Engine zu starten, oder wenn es sich nicht um eine Datei handelt, wird die angegebene Zeichenfolge weitergeleitet.

Moeen M.
quelle
1
IMO haben Sie das offizielle Dokument, das klar wie Schlamm ist, nicht verbessert - neben der Überladung der -bFlagge, was ist der wesentliche Unterschied zwischen -c& -bbeide starten die Engine und zeigen auf eine Cookie-Datei?
nhed
4
@nhed -c schreibt in die Cookie-Datei, -bliest daraus. Wenn Sie also Anmeldeinformationen für ein Anmeldeformular senden, geben Sie -can, dass das resultierende Cookie in eine Datei geschrieben werden soll. Anschließend -blesen Sie das Cookie aus und fügen es in Ihre nächste Anfrage ein.
Madbreaks
26
Oder curl -b cookiefile -c cookiefile https://yourhost/lesen und schreiben Sie im selben Cookie-Store wie Browser.
LinuxDisciple
38

Sie verwenden ein falsches Format in Ihrer Cookie-Datei. In der Curl-Dokumentation wird ein altes Netscape-Cookie-Dateiformat verwendet, das sich von dem von Webbrowsern verwendeten Format unterscheidet. Wenn Sie eine Curl-Cookie-Datei manuell erstellen müssen, sollte dieser Beitrag Ihnen helfen. In Ihrem Beispiel sollte die Datei die folgende Zeile enthalten

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

mit 7 TAB getrennten Feldern bedeutet Domäne , tailmatch , Weg , sicher , abläuft , Name , Wert .

yurloc
quelle
2
Ja, dies ist das cURL-Cookie-Format. Dies sind TABS und keine SPACES.
m3nda
4
Dies sollte als offizielle Antwort markiert werden, da dies wirklich den Punkt anspricht, warum das Setup von @ daydreamer fehlgeschlagen ist.
Valber
0

Wenn Sie diese Anforderung bereits in Ihrer Anwendung gestellt haben und sie in den Google Dev Tools protokolliert sehen, können Sie den Befehl cURL kopieren aus dem Kontextmenü verwenden, wenn Sie mit der rechten Maustaste auf die Anforderung auf der Registerkarte Netzwerk klicken. Kopieren -> Als cURL kopieren. Es enthält alle Header, Cookies usw.

Flip
quelle