¿Cómo usar cURL para enviar cookies?

296

Leí que Enviar cookies con curl funciona, pero no para mí.

Tengo un RESTpunto final como:

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

Cuando intento acceder como:

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

Donde mi ~/Downloads/cookies.txtes:

cat ~/Downloads/cookies.txt
USER_TOKEN=in

y el servidor no recibe nada:

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 -

¿Qué es lo que me falta?

soñador
fuente
Creo que agregar la -copción le dice curlque use su archivo de cookie como el tarro de cookies de salida, que podría no ser lo que desea.
Blender
el que tiene la -bopción sola tampoco funciona, dando el mismo error :(
daydreamer
el formato del -barchivo de cookies no es solo var=value, debe ser el mismo que el formato del tarro de cookies escrito usando -c. Vaya a un sitio que envíe cookies con esta opción y eche un vistazo al archivo resultante.
Barmar
El -b cookie_file debe estar en formato Netscape / Mozilla o en encabezados HTTP simples. Aquí hay un ejemplo de encabezados http simples: Set-cookie: cookie_name = cookie_value; Este es el mínimo indispensable. No olvides el punto y coma al final.
Alex

Respuestas:

492

Esto funcionó para mí:

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

Pude ver el valor en el backend usando

print request.cookies
soñador
fuente
17
Siempre y cuando nunca, tenga un booleano para un token de usuario como una cookie, dado que solo pueden autenticarse sin iniciar sesión de esa manera.
matts1
15
De acuerdo con la página del manual, para la opción -b, --cookie, por ejemplo curl -b <file-or-pairs>, si el argumento es una cadena que tiene el '='símbolo, se pasa como está, de lo contrario, se trata como un nombre de archivo para leer la cookie.
ryenus
61
se pueden establecer varias cookies con punto--cookie "key1=val1;key2=val2;..."
¿Por qué no está esta respuesta en la parte superior? Me pregunto ... ¿Complemento para ordenar respuestas?
iomv
91

Puede consultar https://curl.haxx.se/docs/http-cookies.html para obtener un tutorial completo sobre cómo trabajar con cookies. Puedes usar

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

para escribir en un archivo de cookies e iniciar el motor y usar cookies, puede usar

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

para leer las cookies e iniciar el motor de cookies, o si no es un archivo, pasará la cadena dada.

Moeen M
fuente
1
OMI que no mejoró en el documento oficial que es claro como el barro - junto a la sobrecarga de la -bbandera de lo que es el diff esencial entre -cy -bambos se arranque el motor y punto a un archivo de cookies?
nhed
44
@nhed -c escribe en el archivo de cookies, -blee de él. Por lo tanto, al enviar credenciales para un formulario de inicio de sesión, debe especificar -cque se escriba la cookie resultante en un archivo, luego se usaría -bpara leer e incluir la cookie en su próxima solicitud.
Madbreaks
26
O haga curl -b cookiefile -c cookiefile https://yourhost/para leer y escribir en la misma tienda de cookies como lo hacen los navegadores.
LinuxDisciple
38

Está utilizando un formato incorrecto en su archivo de cookies. Como dice la documentación de curl , utiliza un antiguo formato de archivo de cookies Netscape, que es diferente del formato utilizado por los navegadores web. Si necesita crear un archivo de cookies curl manualmente, esta publicación debería ayudarlo. En su ejemplo, el archivo debe contener la siguiente línea

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

teniendo 7 campos separados por TAB que significa dominio , coincidencia , ruta , seguro , caduca , nombre , valor .

yurloc
fuente
2
Sí, este es el formato de cookie cURL. Estas son TABS y no ESPACIOS.
m3nda
44
Esto debería marcarse como la respuesta oficial, ya que esto realmente aborda el punto de por qué la configuración de @ daydreamer estaba fallando.
Valber
0

Si ya ha realizado esa solicitud en su aplicación y la ve registrada en Google Dev Tools, puede usar el comando copiar cURL del menú contextual al hacer clic con el botón derecho en la solicitud en la pestaña de red. Copiar -> Copiar como cURL. Contendrá todos los encabezados, cookies, etc.

Dar la vuelta
fuente