Es posible utilizar la función header() para solicitar
una identificación ("Authentication Required"
) al cliente,
generando así la aparición de una ventana
de solicitud de usuario y contraseña. Una vez que los
campos han sido completados, la URL será llamada de nuevo, con las variables predefinidas
PHP_AUTH_USER, PHP_AUTH_PW y
AUTH_TYPE conteniendo respectivamente el nombre de usuario, la contraseña y
el tipo de identificación. Estas variables predefinidas se encuentran en los arrays
$_SERVER.
Solo los métodos de identificación simple ("Basic")
son soportados. Consulte la función
header() para más información.
Aquí hay un ejemplo de script que fuerza la identificación del cliente para acceder a una página:
Ejemplo #1 Ejemplo de identificación HTTP simple
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texto utilizado si el visitante usa el botón de cancelación';
exit;
} else {
echo "<p>Hola, {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Su contraseña es {$_SERVER['PHP_AUTH_PW']}.</p>";
}
?>
Nota: Nota de compatibilidad
Sea muy cuidadoso al usar encabezados HTTP con PHP. Para garantizar la máxima compatibilidad entre los navegadores, la palabra clave "Basic" debe escribirse con una B mayúscula, y el texto de presentación debe colocarse entre comillas dobles (no simples), y exactamente un espacio debe preceder al código 401 en el encabezado HTTP/1.0 401. Los parámetros de autenticación deben estar separados por comas.
En lugar de mostrar simplemente las variables globales PHP_AUTH_USER y PHP_AUTH_PW, se preferirá verificar la validez del nombre de usuario y la contraseña. Por ejemplo, enviando esta información a una base de datos, o buscando en un fichero dbm.
Desconfíe de los navegadores con errores, como Internet Explorer.
Parecen ser muy susceptibles en cuanto al orden de los encabezados.
Enviar el encabezado de identificación (WWW-Authenticate)
antes del código de HTTP/1.0 401
parece convenirle
hasta ahora.
Nota: Nota de configuración
PHP utiliza la presencia de la directiva
AuthType
para determinar si una identificación externa está activada. Evite esta directiva de contexto si desea utilizar la identificación de PHP (de lo contrario, ambas identificaciones se contradirán, y fallarán).
Tenga en cuenta, sin embargo, que las manipulaciones anteriores no impiden que cualquier persona con una página no identificada robe las contraseñas de las páginas protegidas, en el mismo servidor.
Netscape e Internet Explorer borrarán la caché de identificación del cliente si reciben una respuesta 401. Esto permite desconectar a un usuario, para forzarlo a ingresar nuevamente su nombre de cuenta y su contraseña. Algunos programadores lo utilizan para proporcionar un tiempo de expiración o, de lo contrario, proporcionan un botón de desconexión.
Ejemplo #2 Identificación HTTP con nombre de usuario/contraseña forzada
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "Debe ingresar un identificador y una contraseña válidos para acceder
a este recurso.\n";
exit;
}
if ( !isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo "<p>Bienvenido: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Anterior: " . htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Re Authenticate' />\n";
echo "</form></p>\n";
}
?>
Este comportamiento no es necesario por el estándar
de identificación HTTP Basic
. Las pruebas con
Lynx
han mostrado que no afectaba
la información de sesión al recibir un
mensaje de tipo 401. Esto hace que presionar la tecla "retroceso"
a un cliente Lynx
previamente identificado dé acceso directo a
la fuente. Sin embargo, el usuario puede usar la tecla
'_'
para destruir las identificaciones anteriores.
Para hacer funcional la autenticación HTTP con un servidor IIS con
la versión CGI de PHP, debe editar
su configuración "Directory Security
". Haga clic
en "Edit
" y active solo
"Anonymous Access
", todos los demás campos deben
dejarse inactivos.
Nota: Nota para los usuarios de IIS:
Para que la identificación HTTP funcione con IIS, la directiva PHP cgi.rfc2616_headers debe establecerse en0
(el valor por defecto).