CURL para acceder a una página que requiere un inicio de sesión desde una página diferente

125

Tengo 2 páginas: xyz.com/ay xyz.com/b. Solo puedo acceder xyz.com/bsi y solo si inicio sesión xyz.com/aprimero. Si accedo xyz.com/bsin pasar por el otro, simplemente se me niega el acceso (sin redirección para iniciar sesión) a través del navegador. Una vez que inicie sesión en xyz.com/a, puedo acceder al otro.

Mi problema es hacer esto usando el comando curl. Puedo iniciar sesión correctamente para xyz.com/ausar curl, pero luego lo intento xyx.com/by se me niega el acceso.

Yo uso lo siguiente:

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

Intenté usar la segunda línea con y sin la parte de usuario / contraseña y todavía no funciona. Ambas páginas usan la misma CA, por lo que eso no es un problema. ¿Alguna sugerencia? Gracias

ms1013
fuente

Respuestas:

147

Es probable que el sitio web utilice cookies para almacenar la información de su sesión. Cuando corres

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

curlse ejecuta dos veces, en dos sesiones separadas. Por lo tanto, cuando se ejecuta el segundo comando, las cookies establecidas por el primer comando no están disponibles; es como si hubiera iniciado sesión en la página aen una sesión del navegador y hubiera intentado acceder a la página ben otra diferente.

Lo que debe hacer es guardar las cookies creadas por el primer comando:

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

y luego vuelva a leerlos cuando ejecute el segundo:

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

Alternativamente, puede intentar descargar ambos archivos en el mismo comando, que creo que utilizará las mismas cookies.

Caracol mecánico
fuente
Esto es extraño porque cuando intento esto, no funciona ya que la cookie almacenada en somefilecontiene el parámetro de ruta ( /aen este caso) y no se reenvía a la segunda llamada. Si edito la cookie en el archivo y solo pongo una barra, funciona (la cookie se reenvía a la segunda llamada). ¿Sabe si es posible evitar el almacenamiento de la ruta en el archivo de cookies?
рüффп
124

También es posible que desee iniciar sesión a través del navegador y obtener el comando con todos los encabezados, incluidas las cookies:

Abra la pestaña Red de Herramientas para desarrolladores, inicie sesión, navegue a la página necesaria, use "Copiar como cURL".

captura de pantalla

usuario
fuente
12
¡Esta es una respuesta profunda! No responde a la pregunta directamente, porque muestra cómo responderla.
bgStack15
5
esa es una de las respuestas más útiles. Realmente le permite observar y comprender incluso la autenticación de varios pasos.
Pierre D
No conocía esta característica enterrada en esas increíbles herramientas. ¡Súper útil!
Timothy C. Quinn
52

Después de buscar en Google encontré esto:

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

No tengo idea de si funciona, pero podría llevarlo en la dirección correcta.

Joe Mills
fuente
9
Esto funcionará si tiene un sitio web que espera que se envíe un formulario. Deberá buscar en la fuente y encontrar la imagen <form> y ver cuál es el nombre de los campos y en qué URL debe publicarse. Puede utilizar el depurador de su navegador web para buscar la solicitud de publicación y ver lo que se envía. Eso es un poco más fácil.
Stonefury
0

Mi respuesta es una modificación de algunas respuestas anteriores de @JoeMills y @user.

  1. Obtenga un cURLcomando para iniciar sesión en el servidor:

    • Cargue la página de inicio de sesión para el sitio web y abra el panel Red de Herramientas para desarrolladores
      • En Firefox, haga clic con el botón derecho en la página, elija 'Inspeccionar elemento (Q)' y haga clic en la pestaña Red
    • Vaya al formulario de inicio de sesión, ingrese el nombre de usuario, la contraseña e inicie sesión
    • Una vez que haya iniciado sesión, vuelva al panel Red y desplácese hasta la parte superior para encontrar la entrada POST. Haga clic derecho y elija Copiar -> Copiar como CURL
    • Pegue esto en un editor de texto e intente esto en el símbolo del sistema para ver si funciona
      • Es posible que algunos sitios tengan un endurecimiento que bloquee este tipo de falsificación de inicio de sesión que requeriría más pasos a continuación para omitir.
  2. Modifique el comando cURL para poder guardar la cookie de sesión después de iniciar sesión

    • Eliminar la entrada -H 'Cookie: <somestuff>'
    • Agregar después curlal principio-c login_cookie.txt
    • Intente ejecutar este comando curl actualizado y debería obtener un nuevo archivo 'login_cookie.txt'en la misma carpeta
  3. Llame a una nueva página web utilizando esta nueva cookie que requiere que inicie sesión

    • curl -b login_cookie.txt <url_that_requires_log_in>

He probado esto en Ubuntu 20.04 y funciona como un encanto.

Timothy C. Quinn
fuente