Sesión PHP NTLM con cURL

Así que un poco de trivia primero …

Está escrito en el sitio web ASP.NET, que utiliza el protocolo NTLM para autenticar a los usuarios que desean iniciar sesión. Está perfectamente bien cuando normalmente lo usan, escriben la URL del sitio web, proporcionan sus credenciales, autentican y mantienen la sesión en el navegador web.

Lo que quiero hacer es crear un sitio web PHP que actúe como bot. Es el sitio web interno de mi empresa y estoy aprobado para hacerlo. El problema con el que me encuentro es la gestión de la sesión. Los usuarios podrán ingresar sus credenciales en mi sitio web PHP, y mi sitio web PHP los autenticará en el sitio de destino, utilizando cURL.

El código que obtuve hasta ahora es:

$cookie_file_path = dirname(__FILE__) . '/cookies.txt'; $ch = curl_init(); //============================================================== curl_setopt($ch, CURLOPT_USERPWD, $username. ':' . $password); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLINFO_HEADER_OUT, true); curl_setopt($ch, CURLOPT_FAILONERROR, 0); curl_setopt($ch, CURLOPT_MAXREDIRS, 100); //============================================================= $ret = curl_exec($ch); 

El código anterior inicia sesión en el sitio web de destino mediante cURL (que gestiona el protocolo de enlace NTLM, como parece) y recupera el contenido de los sitios web. También almacena ID de sesión que se envía de vuelta en el archivo de cookies.

Lo que trato de hacer a continuación, es comentar la opción CURLOPT_USERPWD , con la esperanza de que este script use la ID de sesión almacenada en el archivo de cookies para autenticar al usuario previamente conectado en la segunda ejecución de este script. Podría deshacerse de las credenciales del usuario y no almacenarlas en ninguna parte, ya que no es seguro almacenarlas en una sesión creada manualmente, en una base de datos o en cualquier otro lugar.

Necesito esto porque el bot usará CRON para verificar periódicamente si el estado del sitio web ha cambiado y realizar algunas acciones del usuario como reacción a esto. Pero para hacer esto, el usuario primero debe estar autenticado, y su nombre de usuario y contraseña no deben almacenarse en ningún lado, así que tengo que usar la información de sesión establecida cuando inició sesión por primera vez.

CURL parece NO HACER ESTO. Cuando ejecuto el script por segunda vez con la opción comentada CURLOPT_USERPWD , no utiliza cookies almacenadas para mantener el servidor autenticado. En cambio, reescribe el archivo de cookies sin enviar datos relevantes del servicio como respuesta a la solicitud de acceso NO AUTORIZADO .

Mis preguntas son: ¿Por qué cURL no usa la información almacenada de la sesión para mantener el beeing autenticado? ¿Hay alguna manera de mantener esta sesión con el sitio web basado en el protocolo cURL y NTLM?

Gracias por adelantado.

Hace unos meses tuve un problema similar, entonces tú. Intenté conectarme con una aplicación javision de navision. Navision usa la autenticación ntlm. El problema es que curl no es compatible con ntlm, por lo que debes hacerlo tú mismo.

Una publicación de blog que me ayudó mucho en esta situación fue la siguiente:

http://rabaix.net/en/articles/2008/03/13/using-soap-php-with-ntlm-authentication

** Editar

Perdón, te leí mal la pregunta. Tu problema es simple

Simplemente reciba el encabezado de una solicitud con esta línea

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

Luego puede obtener el resultado de la función curl_exec, el encabezado Set-Cookie.

 preg_match('/^Set-Cookie:\s*([^;]*)/mi', $ret, $match); $cookie = parse_url($match[0]); 

Ahora puede almacenarlo en algún lugar y usarlo en la solicitud 2ten.

Tengo el mismo problema y lo resolví usando curl_setopt($ch, CURLOPT_COOKIEFILE, ""); línea de código. La cadena debe estar exactamente vacía .