Comment utiliser cURL pour envoyer des cookies?

296

J'ai lu que Envoyer des cookies avec curl fonctionne, mais pas pour moi.

J'ai un RESTpoint final comme:

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

Lorsque j'essaie d'accéder en tant que:

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

~/Downloads/cookies.txtest ma :

cat ~/Downloads/cookies.txt
USER_TOKEN=in

et le serveur ne reçoit rien:

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'est-ce qui me manque?

rêveur
la source
Je pense que l'ajout de l' -coption indique curld'utiliser votre fichier cookie comme pot de cookie de sortie, ce qui pourrait ne pas être ce que vous voulez.
Blender
celui avec -boption seul ne fonctionne pas non plus, donnant la même erreur :(
daydreamer
le format du -bfichier cookie n'est pas seulement var=value, il doit être le même que le format du fichier cookie écrit en utilisant -c. Accédez à un site qui envoie des cookies avec cette option et jetez un œil au fichier résultant.
Barmar
Le fichier de cookies -b doit être au format Netscape / Mozilla ou en-têtes HTTP simples. Voici un exemple d'en-têtes http simples: Set-cookie: cookie_name = cookie_value; C'est le strict minimum. N'oubliez pas le point-virgule à la fin.
Alex

Réponses:

492

Cela a fonctionné pour moi:

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

Je pouvais voir la valeur du backend en utilisant

print request.cookies
rêveur
la source
17
Tant que vous n'avez jamais, ayez toujours un booléen pour un jeton d'utilisateur en tant que cookie, étant donné qu'il peut simplement s'authentifier sans se connecter de cette façon.
matts1
15
Selon la page de manuel, pour l'option -b, --cookie, par exemple curl -b <file-or-pairs>, si l'argument est une chaîne ayant le '='symbole, il est passé tel quel, sinon il est traité comme un nom de fichier à partir duquel lire le cookie.
ryenus
61
plusieurs cookies peuvent être définis avec des points--cookie "key1=val1;key2=val2;..."
Pourquoi cette réponse n'est-elle pas en haut, je me demande ... Plug-in de tri des réponses pour tout le monde?
iomv
91

Vous pouvez vous référer à https://curl.haxx.se/docs/http-cookies.html pour un tutoriel complet sur la façon de travailler avec les cookies. Vous pouvez utiliser

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

pour écrire dans un fichier cookie et démarrer le moteur et pour utiliser un cookie, vous pouvez utiliser

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

pour lire les cookies et démarrer le moteur de cookies, ou s'il ne s'agit pas d'un fichier, il transmettra la chaîne donnée.

Moeen M
la source
1
OMI, vous n'avez pas amélioré le document officiel qui est clair comme de la boue - à côté de la surcharge du -bdrapeau, quelle est la différence essentielle entre les deux -cet -bils démarrent le moteur et pointent vers un fichier cookie?
nhed
4
@nhed -c écrit dans le fichier cookie, y -blit. Ainsi, lorsque vous envoyez des informations d'identification pour un formulaire de connexion, vous devez spécifier -cd'écrire le cookie résultant dans un fichier, puis vous devez utiliser -bpour lire et inclure le cookie dans votre prochaine demande.
Madbreaks
26
Ou faites curl -b cookiefile -c cookiefile https://yourhost/pour lire et écrire dans le même magasin de cookies que les navigateurs.
LinuxDisciple
38

Vous utilisez un mauvais format dans votre fichier cookie. Comme l' indique la documentation de curl , il utilise un ancien format de fichier de cookie Netscape, qui est différent du format utilisé par les navigateurs Web. Si vous devez créer un fichier de cookies curl manuellement, ce message devrait vous aider. Dans votre exemple, le fichier doit contenir la ligne suivante

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

ayant 7 champs séparés par TAB signifiant domaine , match arrière , chemin , sécurisé , expire , nom , valeur .

yurloc
la source
2
Oui, c'est le format de cookie cURL. Ce sont des TABS et non des ESPACES.
m3nda
4
Cela devrait être marqué comme la réponse officielle, car cela répond vraiment au problème de l'échec de la configuration de @ daydreamer.
Valber
0

Si vous avez déjà fait cette demande dans votre application et que vous la voyez connectée dans Google Dev Tools, vous pouvez utiliser la commande copier cURL dans le menu contextuel lorsque vous cliquez avec le bouton droit sur la demande dans l'onglet réseau. Copier -> Copier en tant que cURL. Il contiendra tous les en-têtes, cookies, etc.

Retourner
la source