CURL para acessar uma página que requer um login de uma página diferente


124

Tenho 2 páginas: xyz.com/ae xyz.com/b. Eu só posso acessar xyz.com/bse e somente se eu fizer o login xyz.com/aprimeiro. Se acessar xyz.com/bsem passar pelo outro, simplesmente consigo acesso negado (sem redirecionamento para login) através do navegador. Depois de fazer o login em xyz.com/a, posso acessar o outro.

Meu problema é fazer isso usando o comando curl. Posso fazer o login com sucesso xyz.com/ausando o curl, mas tento xyx.com/be consigo o acesso negado.

Eu uso o seguinte:

curl --user user:pass https://xyz.com/a  #works ok
curl https://xyz.com/b #doesn't work

Tentei usar a segunda linha com e sem a parte de usuário / senha e ainda não funciona. Ambas as páginas usam o mesmo CA, então isso não é um problema. Alguma sugestão? obrigado

Respostas:


146

O site provavelmente usa cookies para armazenar as informações da sua sessão. Quando você corre

curl --user user:pass https://xyz.com/a  #works ok
curl https://xyz.com/b #doesn't work

curlé executado duas vezes, em duas sessões separadas. Assim, quando o segundo comando é executado, os cookies definidos pelo primeiro comando não estão disponíveis; é como se você se conectasse à página aem uma sessão do navegador e tentasse acessar a página bem outra.

O que você precisa fazer é salvar os cookies criados pelo primeiro comando:

curl --user user:pass --cookie-jar ./somefile https://xyz.com/a

e depois lê-los de volta ao executar o segundo:

curl --cookie ./somefile https://xyz.com/b

Como alternativa, você pode tentar baixar os dois arquivos no mesmo comando, que acho que usará os mesmos cookies.


Isso é estranho porque quando tento fazer isso não funciona porque o cookie armazenado em somefilecontém o parâmetro de caminho ( /aneste caso) e não é encaminhado para a segunda chamada. Se eu editar o cookie no arquivo e colocar apenas uma barra, ele funciona (cookie encaminhado para a segunda chamada). Você sabe se é possível impedir o armazenamento do caminho no arquivo de cookie?
рüффп

124

Além disso, você pode desejar fazer login pelo navegador e obter o comando com todos os cabeçalhos, incluindo cookies:

Abra a guia Rede das Ferramentas de Desenvolvedor, faça o login, navegue até a página necessária, use "Copiar como cURL".

captura de tela


12
Esta é uma resposta profunda! Não responde à pergunta diretamente, porque mostra como respondê-la.
bgStack15

5
essa é uma das respostas mais úteis. Ele realmente permite que você observe e entenda até mesmo a autenticação em várias etapas.
Pierre D

Eu não sabia sobre esse recurso enterrado nessas ferramentas incríveis. Muito útil!
Timothy C. Quinn

52

Depois de pesquisar no Google, encontrei o seguinte:

curl -c cookie.txt -d "LoginName=someuser" -d "password=somepass" https://oursite/a
curl -b cookie.txt https://oursite/b

Não tenho ideia se funciona, mas pode levar você na direção certa.


9
Isso funcionará se você tiver um site que espera que um formulário seja enviado. Você precisará olhar a fonte e encontrar a imagem <form> e ver qual é o nome dos campos e em qual URL deve ser postado. Você pode usar o depurador do navegador da web para procurar a solicitação de postagem para que possa ver o que está sendo enviado. Isso é um pouco mais fácil.
stonefury

0

Minha resposta é um mod de algumas respostas anteriores de @JoeMills e @user.

  1. Obtenha um cURLcomando para fazer login no servidor:

    • Carregue a página de login para o site e abra o painel Rede das Ferramentas do desenvolvedor
      • No firefox, clique com o botão direito na página, escolha 'Inspecionar Elemento (Q)' e clique na guia Rede
    • Vá para o formulário de login, digite o nome de usuário, senha e faça login
    • Depois de fazer login, volte ao painel Rede e role até o topo para encontrar a entrada POST. Clique com o botão direito e escolha Copiar -> Copiar como CURL
    • Cole em um editor de texto e tente no prompt de comando para ver se funciona
      • É possível que alguns sites tenham proteção que bloqueie esse tipo de falsificação de login que exigiria mais etapas abaixo para contornar.
  2. Modifique o comando cURL para poder salvar o cookie da sessão após o login

    • Remova a entrada -H 'Cookie: <somestuff>'
    • Adicionar depois curldo início-c login_cookie.txt
    • Tente executar este comando curl atualizado e você deverá obter um novo arquivo 'login_cookie.txt'na mesma pasta
  3. Chame uma nova página da web usando este novo cookie que requer que você esteja logado

    • curl -b login_cookie.txt <url_that_requires_log_in>

Eu tentei isso no Ubuntu 20.04 e funciona perfeitamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.