Como usar o cURL para enviar cookies?

296

Eu li que Enviar cookies com cachos funciona, mas não para mim.

Eu tenho um RESTendpoint como:

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

Quando tento acessar 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"%

Onde ~/Downloads/cookies.txtestá o meu :

cat ~/Downloads/cookies.txt
USER_TOKEN=in

e o servidor não recebe 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 -

O que é que estou perdendo?

sonhador
fonte
Eu acho que adicionar a -copção diz curlpara usar seu arquivo de cookie como o pote de cookies de saída, o que pode não ser o que você deseja.
Blender
aquele com -bopção também não está sozinho trabalhando, dando mesmo erro :(
daydreamer
o formato do -barquivo de cookie não é apenas var=value, ele deve ser o mesmo que o formato do jarro de cookie escrito usando -c. Vá para um site que envia cookies com esta opção e dê uma olhada no arquivo resultante.
Barmar
O -b cookie_file deve estar no formato Netscape / Mozilla ou cabeçalhos HTTP simples. Aqui está um exemplo de cabeçalhos http simples: Set-cookie: cookie_name = cookie_value; Este é o mínimo. Não esqueça o ponto e vírgula no final.
Alex

Respostas:

492

Isso funcionou para mim:

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

Eu pude ver o valor no back-end usando

print request.cookies
sonhador
fonte
17
Contanto que você nunca tenha um booleano para um token de usuário como um cookie, já que eles podem se autenticar sem fazer logon dessa maneira.
matts1
15
De acordo com a página do manual, por opção -b, --cookie, por exemplo curl -b <file-or-pairs>, se o argumento é uma string com o '='símbolo, ele é passado como está, caso contrário, é tratado como um nome de arquivo para o qual ler o cookie.
ryenus
61
vários cookies podem ser definidos com ponto e vírgula--cookie "key1=val1;key2=val2;..."
Por que essa resposta não está no topo, eu me pergunto ... O plugin de classificação de respostas é alguém?
Iomv 06/08/19
91

Você pode consultar https://curl.haxx.se/docs/http-cookies.html para obter um tutorial completo de como trabalhar com cookies. Você pode usar

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

para gravar em um arquivo de cookie e iniciar o mecanismo e usar o cookie, você pode usar

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

para ler cookies e iniciar o mecanismo de cookies, ou, se não for um arquivo, passará para a string especificada.

Moeen M
fonte
1
Na IMO, você não aprimorou o documento oficial que é claro como lama - além da sobrecarga da -bbandeira, qual é a diferença essencial entre eles -ce -bambos iniciam o mecanismo e apontam para um arquivo de cookie?
nhed
4
@nhed -c grava no arquivo de cookies e -blê a partir dele. Portanto, ao enviar credenciais para um formulário de login, você especificaria -ca gravação do cookie resultante em um arquivo e utilizaria -bpara ler e incluir o cookie na sua próxima solicitação.
precisa saber é o seguinte
26
Ou faça curl -b cookiefile -c cookiefile https://yourhost/para ler e gravar na mesma loja de cookies que os navegadores fazem.
LinuxDisciple
38

Você está usando um formato errado no seu arquivo de cookie. Como a documentação do curl indica, ele usa um formato de arquivo de cookie Netscape antigo, diferente do formato usado pelos navegadores da web. Se você precisar criar um arquivo de cookie de ondulação manualmente, esta postagem deverá ajudá-lo. No seu exemplo, o arquivo deve conter a seguinte linha

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

tendo 7 campos separados por TAB, que significam domínio , correspondência , caminho , seguro , expira , nome , valor .

yurloc
fonte
2
Sim, este é o formato de cookie cURL. Estes são TABS e não SPACES.
M3nda 26/05
4
Isso deve ser marcado como a resposta oficial, já que isso realmente aborda o motivo pelo qual a instalação do @ daydreamer estava falhando.
Valber 29/11
0

Se você já fez essa solicitação no seu aplicativo e o vê logado no Google Dev Tools, você pode usar o comando copy cURL no menu de contexto ao clicar com o botão direito do mouse na solicitação na guia rede. Copiar -> Copiar como cURL. Ele conterá todos os cabeçalhos, cookies, etc.

Giro
fonte