Jak używać cURL do wysyłania plików cookie?

296

Czytam, że Wyślij ciasteczka z zawijaniem działa, ale nie dla mnie.

Mam RESTpunkt końcowy jako:

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

Kiedy próbuję uzyskać dostęp jako:

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

Gdzie ~/Downloads/cookies.txtjest mój :

cat ~/Downloads/cookies.txt
USER_TOKEN=in

a serwer nic nie otrzymuje:

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 -

Czego mi brakuje?

marzyciel
źródło
Myślę, że dodanie -copcji nakazuje curlużycie pliku cookie jako wyjściowego słoika z ciasteczkami, co może nie być tym, czego chcesz.
Blender
ten z -bsamą opcją również nie działa, dając ten sam błąd :(
daydreamer
format -bpliku cookie jest nie tylko var=value, powinien być taki sam jak format pliku cookie zapisanego przy użyciu -c. Przejdź do strony, która wysyła pliki cookie z tą opcją, i spójrz na wynikowy plik.
Barmar
-B plik_plików cookie powinien mieć format Netscape / Mozilla lub zwykły nagłówek HTTP. Oto przykład zwykłych nagłówków http: Set-cookie: cookie_name = cookie_value; To jest absolutne minimum. Nie zapomnij o średniku na końcu.
Alex

Odpowiedzi:

492

To działało dla mnie:

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

Mogłem zobaczyć wartość za pomocą backendu

print request.cookies
marzyciel
źródło
17
Tak długo, jak nigdy nie masz logicznej wartości dla tokena użytkownika jako pliku cookie, biorąc pod uwagę, że mogą się oni po prostu uwierzytelnić bez logowania w ten sposób.
matts1
15
Według strony podręcznika, dla opcji -b, --cookie, np. curl -b <file-or-pairs>Jeśli argument jest ciągiem zawierającym '='symbol, jest przekazywany tak, jak jest, w przeciwnym razie jest traktowany jako nazwa pliku, z którego można odczytać plik cookie.
ryenus
61
za pomocą średników można ustawić wiele plików cookie--cookie "key1=val1;key2=val2;..."
Zastanawiam się, dlaczego nie ma tej odpowiedzi ... Wtyczka sortująca odpowiedzi?
iomv,
91

Możesz zapoznać się z https://curl.haxx.se/docs/http-cookies.html, aby uzyskać pełny samouczek na temat pracy z plikami cookie. Możesz użyć

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

zapisać plik cookie i uruchomić silnik oraz użyć pliku cookie, którego możesz użyć

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

aby odczytać pliki cookie i uruchomić silnik plików cookie, lub jeśli nie jest to plik, przekaże podany ciąg.

Moeen M.
źródło
1
IMO nie było poprawić na podstawie oficjalnego dokumentu, który jest jasne jak słońce - obok przeciążenia z -bflagą, co jest niezbędne diff pomiędzy -c& -boboje uruchomić silnik i wskaż plik ciasteczka?
nhed
4
@ nhed -c zapisuje do pliku cookie, -bodczytuje z niego. Tak więc, wysyłając dane uwierzytelniające do formularza logowania, zdecydujesz -csię zapisać wynikowy plik cookie do pliku, a następnie użyjesz go -bdo odczytania i dołączenia pliku cookie do następnego żądania.
Madbreaks
26
Możesz też curl -b cookiefile -c cookiefile https://yourhost/czytać i pisać w tym samym sklepie z ciasteczkami, co przeglądarki.
LinuxDisciple,
38

Używasz niewłaściwego formatu w swoim pliku cookie. Jak stwierdza dokumentacja curl , używa starego formatu pliku cookie Netscape, który różni się od formatu używanego przez przeglądarki internetowe. Jeśli musisz ręcznie utworzyć plik cookie curl, ten post powinien ci pomóc. W twoim przykładzie plik powinien zawierać następujący wiersz

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

posiadający 7 pól oddzielonych TAB, co oznacza domenę , dopasowanie , ścieżkę , bezpieczeństwo , wygasa , nazwę , wartość .

yurloc
źródło
2
Tak, jest to format pliku cookie cURL. Są to TABS, a nie PRZESTRZEŃ.
m3nda
4
Powinno to zostać oznaczone jako oficjalna odpowiedź, ponieważ to naprawdę odnosi się do kwestii, dlaczego konfiguracja @ daydreamer nie powiodła się.
Valber
0

Jeśli już złożyłeś to żądanie w swojej aplikacji i widzisz je jako zalogowane w Google Dev Tools, możesz użyć polecenia kopiuj cURL z menu kontekstowego, klikając prawym przyciskiem myszy żądanie na karcie sieci. Kopiuj -> Kopiuj jako cURL. Będzie zawierać wszystkie nagłówki, pliki cookie itp.

Trzepnięcie
źródło