Autentificación HTTP con PHP

La autentificación HTTP ocurre cuando el navegador del usuario muestra una ventana emergente de Autentificación requerida, solicitando usuario y contraseña para poder ingresar a un determinado sitio. En esta ocasión solicitaremos los datos al usuario por este método para luego procesarlo con PHP.

login-firefox.gif

Mostrar la ventana emergente
Lo primero es enviar un header al navegador indicándole que el sitio requiere autentificación, este mostrará automáticamente una ventana emergente solicitando las credenciales del usuario. Para ello crearemos un función que se encarga de enviar los headers necesarios, notase que en Basic realm podemos personalizar el nombre del servicio y al final escribimos el mensaje para cuando el usuario no puede ingresar.

function showLogin() {
	header('WWW-Authenticate: Basic realm="Demo System"');
	header('HTTP/1.0 401 Unauthorized');
	echo "Usted no tiene permisos para ingresar.\n";
	exit;
}

Verificando los datos ingresados
Una ves que el usuario ha ingresado los datos de acceso estos se pueden acceder con PHP con las siguientes constantes predefinidas.

  • $_SERVER[‘PHP_AUTH_USER’]: nombre de usuario ingresado.
  • $_SERVER[‘PHP_AUTH_PW’]: clave ingresada por el usuario.

Luego verificamos si existe la variable con el nombre del usuario, en el caso que no exista mostramos la pantalla de login con la función antes creada, si existe la comparamos para verificar si el usuario y clave son correctos. En el caso los datos sean correctos redireccionamos al usuario por ejemplo a la página solicitada de lo contrario mostramos nuevamente la pantalla de login.

$username = $_SERVER['PHP_AUTH_USER'];
$userpass = $_SERVER['PHP_AUTH_PW'];
if (!isset($username)) {
	showLogin();
} else {
	if ($username == "demo" && $userpass == "pass") {
		header("Location: http://blog.unijimpe.net/");
	} else {
		showLogin();
	}
}

Para nuestro ejemplo hemos comparado los datos con dos constantes, pero ustedes pueden hacer una consulta a base de datos para verificar los permisos de acceso. Pueden ver el ejemplo funcionando en: login.php. Finalmente les dejo el archivo fuente para su descarga.

Comentarios Total 12 comentarios

LCsoftEs
Publicado: 18/08/2007 2:21 am

Hola, quisiera saber algo. Y si alguien, en vez de ingresar al sitio de autenticacion, se dirige primero a la página que supuestamente estoy protegiendo con autentificacion, en tu caso blog.unijimpe.net desde la direccion original, me pediria autentificacion al entrar? o necesito añadirle algun script?.

unijimpe
Publicado: 19/08/2007 1:13 am

Lo que tienes que hacer es en cada pagina que deseas que este protegida, verifique si eres usuario registrado y si no lo eres que re redireccione a la página de login, por ejemplo antes de hacer la redireccion podriamos guardar una variable de sesion de la forma:

$_SESSION['login'] = "ok";
header("Location: http://blog.unijimpe.net/");

Luego al inicio de cada una de paginas que desees proteger se tendria:


Marc
Publicado: 20/08/2007 4:51 am

Está muy bien,pero a mi me gustaria que se registraran y luego hicieran el login y entraran en un sitio cualquiera.
Me gustaria un tuto para eso.

flasher
Publicado: 21/08/2007 10:41 am

Muy bueno unijimpe, pero es un tema el no poder colocarle un logout o bueno no le encontré la forma, por alguna extraña razón no podía usar la Autentificación HTTP junto con las variables de sesión o_O?

saludos :D

dario
Publicado: 28/08/2007 4:46 am

hola ya tengo todo armado pero el problema q tengo ahora es como hago para que consulte a la base de datos.
la base ya la tengo armada pero nose como hacer para que al escribir es usuario y la contraseña consulte a la base que tengo que poner en el codigo
me podes ayudar.

salvador
Publicado: 30/08/2007 12:07 am

hola. necesito saber como puedo hacer hacer la consulta a base de datos para verificar los permisos de acceso. es muy urgente saberlo.por favor. podrian disipar mi duda?

Carlos López
Publicado: 31/08/2007 11:59 pm

Yo tengo otra duda

TEngo una página que la he desarrollado en Mambo usando PHP/MySQL pero esa página tiene servicios a los cuales he desarrollado en ASP.Net, y para accesar a ellos el usuario debe autentificarse, y me gustaría saber como puedo pasar la sesión que se genera en el mambo al ASP, pues cuando pido saber el número de cookies creadas en el ASP, me indica que no hay ninguna cookie, y estaba pensando en usar los http headers, pero aún no encuentro una forma viable de usarlos, xD

Juan Carlos
Publicado: 20/09/2007 10:55 pm

Una pregunta ? es posible desde PHP autenticarse contra el directorio activo de Windows ? hace poco me plantearon esa posibilidad , pero hasta ahora no he encontrado nada que hable sobre eso.

les agradezco

Octavio Guerrero
Publicado: 02/10/2007 3:45 am

como le hago que esta rutina funcione con una tabla de mysql me ¡¡¡¡urge!!! se los agradecere mucho

Cesar Beltran
Publicado: 13/02/2008 6:16 pm

Para que funcione con una tabla mysql recomiendo utilizar una clase en php que defina todos los aspectos de conexion y consulta en la BD. Y despues hacer uso de la clase como lo siguiente

Para ese ejemplo me base en eel modelo de conexion empleado en el CMS, PHP Nuke.

Blablablator
Publicado: 08/05/2008 2:01 pm

Para conectarlo a una BD MySql yo utilizo un script asi:

$sql=»Select * FROM usuario where nombreusuario=’$username’ AND passusuario=’$userpass'»;
$result=mysql_query($sql,$link);
$row=mysql_fetch_row($result);
if ($row[1] == $username && $row[2] == $userpass){
echo «OK»;
}else{
login();
}

((falta la cadena de conexion a la bd, que cada uno usara la suya :) ))

Santiago Rojas
Publicado: 30/03/2009 10:28 pm

Hola, es bueno usar eso, pero el codigo como lo pones asi es rebundante, repites mucho, por ejemplo puedes usar algo asi:

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)