Las caracter铆ticas de autentificaci贸n HTTP en PHP solo est谩n disponibles cuando se est谩 ejecutando como un m贸dulo en Apache y hasta ahora no lo estan en la versi贸n CGI. En un script PHP como m贸dulo de Apache, se puede usar la funci贸n header() para enviar un mensaje de "Autentificaci贸n requerida" al navegador cliente haciendo que muestre una ventana de entrada emergente con nombre de usuario y contrase帽a. Una vez que el usuario ha rellenado el nombre y la contrase帽a, la URL que contiene el script PHP ser谩 llamada de nuevo con las variables predefinidas PHP_AUTH_USER, PHP_AUTH_PW, y AUTH_TYPE asignadas con el nombre de usuario, la contrase帽a y el tipo de autentificaci贸n respectivamente. Estas variables predefinidas se pueden encontrar en las matrices $_SERVER y $HTTP_SERVER_VARS. S贸lo autentificaci贸n "B谩sica" est谩 soportada en este momento. Consulte la funci贸n header() para m谩s informaci贸n.
Nota sobre la versi贸n PHP: Las Autoglobales, tales como $_SERVER, han estado disponibles desde la versi贸n de PHP 4.1.0. $HTTP_SERVER_VARS ha estado disponible desde PHP 3.
Un script de ejemplo que fuerce la autentificaci贸n del cliente en una p谩gina ser铆a como el siguiente:
Nota de compatibilidad: Por favor tener cuidado cuando esteis programando las lineas de cabecera HTTP. Para garantizar la m谩xima compatibilidad con todos los clientes, la palabra clave "Basic" debe de ser escrita con "B" may煤scula, la cadena de texto debe estar incluida entre comillas dobles (no simples) y exactamente un espacio debe preceder el c贸digo 401 en la linea de cabecera HTTP/1.0 401
En vez de, sencillamente, mostrar PHP_AUTH_USER y PHP_AUTH_PW, seguramente querais comprobar la validez del nombre de usuario y la contrase帽a. Tal vez enviando una consulta a una base de datos o buscando el usuario en un fichero dbm.
Vigilar aqu铆 los navegadores Interner Explorer con bugs. Parecen muy quisquillosos con el orden de las cabeceras. Enviar la cabecera WWW-Autentificaci贸n antes que la cabecera HTTP/1.0 401 parece ser el truco por ahora.
En fecha de la versi贸n PHP 4.3.0, para prevenir que alguien escriba un script que revele la contrase帽a de una p谩gina que ha sido autentificada a trav茅s de alg煤n mecanismo externo tradicional, las variables PHP_AUTH no ser谩n asignadas si alg煤n tipo de autentificaci贸n externa ha sido activada para la p谩gina en particular. En este caso, la variable REMOTE_USER puede ser usada para identificar al usuario autentificado externamente. Asi que se puedes utilizar $_SERVER['REMOTE_USER'].
Configuration Note: PHP usa la directiva AuthType para determinar si una autentificaci贸n externa esta en uso.
Nota, a pesar de todo, lo ya dicho no proteje de que alguien que controle una URL no autentificada robe contrase帽as de URLs autentificadas en el mismo servidor.
Tanto Netscape como Internet Explorer borrar谩n la cach茅 de la ventana de autentificaci贸n en el navegador local despu茅s de recibir una respuesta 401 del servidor. Esto puede usarse, de forma efectiva, para "desconectar" a un usuario, forzandole a reintroducir su nombre y contrase帽a. Algunas personas usan esto para "hacer caducar" entradas, o para proveer un bot贸n de "desconectar".
Ejemplo 34-2. Ejemplo de autentificaci贸n HTTP forzando una reentrada
|
Este comportamiento no es requerido por el est谩ndar de autentificaci贸n b谩sica de HTTP, por lo que nunca debe depender de esto. Pruebas con Lynx han demostrado que Lynx no borra las credenciales de autentificaci贸n con una respuesta 401 del servidor, por lo que pulsando atr谩s y despu茅s adelante abrir铆a el recurso de nuevo (siempre que los requerimientos de contrase帽a no hayan cambiado).
Adem谩s tener en cuenta que hasta la version de PHP 4.3.3, la autentificaci贸n HTTP no funcionaba con el servidor IIS de Microsoft y la versi贸n CGI de PHP, debido a una limitaci贸n de IIS. Para que funcione a partir de PHP 4.3.3, debeis de editar vuestra configuraci贸n sobre "Seguridad en directorios" en IIS. Pulsar en 'Editar" y elegir solamente "acceso anonimo", todos los demas campos no se deben de elegir.
Otra limitaci贸n es, si estais usando el m贸dulo de IIS (ISAPI), que no podeis usar las variables PHP_AUTH_*, en su lugar debeis utilizar la variable HTTP_AUTHORIZATION. Por ejemplo: list($user, $pw) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Nota para IIS:: Para que la autentificaci贸n HTTP funcione con IIS, la directiva de PHP cgi.rfc2616_headers debe de tener el valor 0 (valor por defecto).
Nota: Si safe mode est谩 activado, el uid de el script es agregado a la cabecera WWW-Authenticate