Come usare cURL per inviare i cookie?


296

Ho letto che Invia cookie con curl funziona, ma non per me.

Ho un RESTendpoint come:

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

Quando provo ad accedere come:

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

Dove ~/Downloads/cookies.txtè il mio :

cat ~/Downloads/cookies.txt
USER_TOKEN=in

e il server non riceve nulla:

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 -

Cosa mi manca?


Penso che l'aggiunta -cdell'opzione indichi curldi utilizzare il tuo file cookie come cookie jar di output, che potrebbe non essere quello che desideri.
Blender

anche quello con l' -bopzione da sola non funziona, dando lo stesso errore :(
sognatore ad occhi aperti il

il formato del -bfile cookie non è solo var=value, dovrebbe essere uguale al formato del cookie cookie scritto usando -c. Vai a un sito che invia cookie con questa opzione e dai un'occhiata al file risultante.
Barmar,

Il file -b cookie_ dovrebbe essere nel formato Netscape / Mozilla o nelle semplici intestazioni HTTP. Ecco un esempio di semplici intestazioni http: Set-cookie: cookie_name = cookie_value; Questo è il minimo indispensabile. Non dimenticare il punto e virgola alla fine.
Alex

Risposte:


492

Questo ha funzionato per me:

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

Ho potuto vedere il valore nel backend usando

print request.cookies

17
Finché non hai mai, mai avuto un valore booleano per un token utente come cookie, dato che possono semplicemente autenticarsi senza accedere in quel modo.
1

15
Secondo la pagina man, ad -b, --cookieesempio curl -b <file-or-pairs>, se l'argomento è una stringa con il '='simbolo, viene passato così com'è, altrimenti viene trattato come un nome file da cui leggere i cookie.
reno

61
è possibile impostare più cookie con punto e virgola--cookie "key1=val1;key2=val2;..."

Perché questa risposta non è in cima, mi chiedo ... Plugin per l'ordinamento delle risposte?
iomv,

91

Puoi fare riferimento a https://curl.haxx.se/docs/http-cookies.html per un tutorial completo su come lavorare con i cookie. Puoi usare

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

per scrivere in un file cookie e avviare il motore e utilizzare i cookie che è possibile utilizzare

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

per leggere i cookie e avviare il motore dei cookie o, se non è un file, passerà la stringa specificata.


1
IMO non hai migliorato il documento ufficiale che è chiaro come fango - oltre al sovraccarico della -bbandiera qual è la differenza essenziale tra -ce -bentrambi avviano il motore e puntano a un file di cookie?
nhed

4
@nhed -c scrive nel file cookie, -blegge da esso. Pertanto, quando si inviano le credenziali per un modulo di accesso, si specifica -cdi scrivere il cookie risultante in un file, quindi si utilizza -bper leggere e includere il cookie nella richiesta successiva.
Madbreaks,

26
Oppure fai curl -b cookiefile -c cookiefile https://yourhost/per leggere e scrivere nello stesso negozio di cookie come fanno i browser.
LinuxDisciple

38

Stai utilizzando un formato errato nel tuo file cookie. Come afferma la documentazione di arricciatura , utilizza un vecchio formato di file cookie Netscape, che è diverso dal formato utilizzato dai browser Web. Se è necessario creare manualmente un file cookie arricciatura, questo post dovrebbe aiutarti. Nel tuo esempio il file dovrebbe contenere la seguente riga

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

con 7 campi separati da TAB che significa dominio , tailmatch , percorso , sicuro , scade , nome , valore .


2
Sì, questo è il formato del cookie cURL. Sono TAB e non SPAZI.
m3nda,

4
Questa dovrebbe essere contrassegnata come la risposta ufficiale, dal momento che questo affronta davvero il punto sul perché l'installazione di @ daydreamer non è riuscita.
Valber,

0

Se hai già fatto tale richiesta nella tua applicazione e la vedi registrata in Google Dev Tools, puoi utilizzare il comando copia cURL dal menu contestuale facendo clic con il tasto destro del mouse sulla richiesta nella scheda di rete. Copia -> Copia come cURL. Conterrà tutte le intestazioni, i cookie, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.