:::: MENU ::::

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.


12 Comentarios

  • LCsoftEs |

    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 |

    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:

    < ?php
    session_start();
    if (!isset($_SESSION['login']) {
    header("login.php");
    }
    ?>

  • Marc |

    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 |

    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 |

    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 |

    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 |

    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 |

    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 |

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

  • Cesar Beltran |

    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 |

    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 |

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

Publica tu comentario

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;.