viernes, 22 de junio de 2012

Autenticación PHP con LDAP (Directorio Activo)

Muchas veces cuando realizamos alguna aplicación para una empresa gastamos mucho tiempo creando nuestra base de datos con la estructura de la empresa, los datos de los usuarios (nombres, nicks , contraseñas, datos de contacto),  certificados, permisos y olvidamos una fuente valiosa de información q tenemos a la mano, donde toda esta información puede aparecer organizada de manera lógica y jerárquica: "El Directorio Activo (LDAP)". Por supuesto estamos hablando de empresas con su propia red.

Pero antes de comenzar con el código vamos a definir un poquito q es el Directorio Activo y cómo se encuentra organizada la información en él.
"LDAP son las siglas de Lightweight Directory Access Protocol (Protocolo Ligero de Acceso a Directorios) que hacen referencia a un protocolo a nivel de aplicación el cual permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red." (Esta definición la encontré en Wikipedia y creo da una idea bastante exacta de lo q es LDAP).

Así que mi consejo de hoy es: "si te encuentras haciendo una aplicación empresarial comiences por revizar qué tienes ya en el directorio activo", creéme si está bien estructurado puedes ahorrar mucho tiempo.

¿Cómo se estructura el Directorio Activo?
Simplemente en forma de árbol donde los DNS se utilizan para estructurar los niveles más altos de la jerarquía y conforme se desciende en el directorio pueden aparecer entradas que representan personas, unidades organizacionales o cualquier cosa que representa una entrada dada en el árbol (o múltiples entradas).

Bueno ya podemos comenzar a programar. Por ejemplo vamos a utilizar los datos del Directorio Activo en la autenticación de nuestra Web.

 Algo más que debes saber antes de comenzar: "Nombres y Atributos de LDAP"

  DN: se utiliza en el directorio activo para nombrar la entrada (Distinguished Name)
  CN: common name (nombre completo tiene givenName(nombre propio) y sn(surname o apellido))
  DC: domain component (componentes de dominios)
  OU: organizacional unit (unidades organizacionales)

Ejemplo de estructura de LDAP:
dn: cn="Yeny Firvida" ou="Unidad de Desarrollo de Software" ou="Sucursal Puebla" dc="ejemplo" dc="com" dc="mx"
Como pueden ver los atributos se pueden repetir o no, se debe consultar al administrador de red para ver el diseño específico de su directorio activo.
otros atributos pueden ser:
mail: dirección de correo.
telephoneNumber: número telefónico

Ahora si vamos al código

<?php
//vamos a comenzar conectándonos al directorio activo
 $ds=ldap_connect("hercules.ejemplo.com.mx");  // este es el host donde se encuentra el directorio  
if ($ds) {

    //ldap_ bind: función que permite autenticarse en el directorio.
    //declaro las variables user y pass para recoger los datos q se entraron en el formulario.
    $user =  $_Post[usuario];
    $pass  =$_Post[password];
    if(ldap_bind($ds, $user, $pass)) {

    //existe la combinación de usuario y contraseña
     // abro la sessión (el trabajo con sessiones lo voy a tartar en otra entrega)
     session.start();
     $_SESSION["usuario"] = $user;
    } else {
        //si no se pudo autenticar es q no existe esa combinación de usuario y contraseña
       //imprimo mensaje de error
        echo "Acceso denegado. Verifique usuario y contraseña";
    }
          

    ldap_close($ds);
} else {
    echo "Error al conectarse con el servidor LDAP";

  //vale señalar que el error más común  aqui es que el camino al directorio activo no sea correcto
}
?>

No solo puede utilizarse el directorio activo para la autenticación, se puede obtener cualquier otro dato que se encuentre registrado en el con la funcion ldap_search pero eso lo trataremos en otra entrada.

Espero les sea de utilidad y ya saben, cualquier duda pueden escribirme. Hasta pronto.