Integrar aplicaciones web a través del conector OpenID de SIR


El objetivo de este documento es presentar una solución que permita integrar aplicaciones web con la federación SIR a través de su conector OpenID. Esta solución es ideal para aquellas aplicaciones que ya están desarrolladas o bien para aquellas que tienen su propio sistema de gestión de cuentas de usuarios. La problemática que reside en éstos es que almacenan, generalmente en una base de datos, un conjunto de información del usuario que no se recibe a través de una federación.

Asociando el identificador de OpenID que tiene el usuario en SIR con la propia cuenta del usuario en la aplicación web permite integrar ésta en el ámbito de Single Sign-On que ofrece su institución a través de la federación SIR, permitiendo al usuario no tener que recordar un par más de nombre_de_usuario/contraseña reduciendo así los riesgos de problemas de seguridad potenciales.

Para aquellas aplicaciones web basadas en la tecnología PHP, se ha desarrollado, basándose en PHP OpenID Library, un conector que facilita la integración de una aplicación web a través de SIR usando la tecnología OpenID. En el siguiente diagrama podemos ver la arquitectura de la solución:

Arquitectura de la solución

Como vemos, hay que generar, o bien adaptar, dos ficheros PHP en nuestra aplicación:

  • login.php: este fichero se encarga de iniciar la autenticación del usuario en SIR. El contenido y estructura típicos de este archivo es:
    <?php
    require_once('try_auth.php');
    
    startOpenIDAuth('logged.php');
    ?>
    		

    Como vemos, éste tan sólo tiene que importar el archivo try_auth.php del conector de PAPOID y llamar al método startOpenIDAuth indicando sobre que archivo queremos que se llegue de vuelta una vez realizado el proceso de autenticar al usuario en el SIR.

  • logged.php: este fichero se encarga de procesar el mensaje de respuesta que ha emitido SIR sobre el usuario. Para ello deberá tener la siguiente estructura:
    <?php
    require_once('finish_auth.php');
    
    function OpenID_finish_auth_success($openid_identity) {
    
    }
    
    function OpenID_finish_auth_error($msg) {
    
    }
    
    if (array_key_exists("openid_error_msg",$_REQUEST)) {
    	OpenID_finish_auth_error($_REQUEST["openid_error_msg"]);
    }
    else {
    	OpenID_parse_response('logged.php');
    }
    ?>
    		

    Como vemos, debe importar el fichero finish_auth.php que ya se incluye en el conector y, además, implementar los dos siguientes métodos:

    • OpenID_finish_auth_success(): este método es invocado si el usuario ha sido autenticado correctamente en SIR, recibiendo el parámetro $openid_identity que contiene el identificador único del usuario en el SIR. Por ejemplo:
      http://yo.rediris.es/soy/kan@rediris.es
      Como vemos, podemos saber tanto el identificador único del usuario en su institución así como la institución a la que pertenece.
    • OpenID_finish_auth_error(): este método es invocado cuando ha ocurrido algún problema a la hora de autenticar al usuario, recibiendo como parámetro el mensaje de error.

Estrategias

Como se ha visto, a través del conector podemos integrar fácilmente nuestras aplicaciones web en la federación SIR. El principal problema que se plantea es cómo co-relacionar dicha identificación con las cuentas de usuario que ya contienen las propias aplicaciones en sus bases de datos.

Esto se consigue relacionando el par nombre_de_usuario/contraseña de la aplicación web con el identificador que tiene dicho usuario en SIR, como vemos ilustrado en el siguiente diagrama:

Solución

De esta forma tenemos dos pasos importantes en nuestro proceso de integración:

  1. Asociar el identificador único en SIR con el par nombre_de_usuario/contraseña. Este paso se consigue utilizando dos ficheros como los comentados más arriba (login.php y logged.php) donde en el segundo, si la autenticación ha sido correcta, se almacena en la base de datos la relación del identificador de SIR (SIR_Username en el diagrama) con el usuario (Username en el diagrama).
  2. Autenticar al usuario a través de SIR. Utilizando otro par de archivos como los de arriba (login.php y logged.php), en el segundo, si la autenticación en SIR ha sido correcta, buscaremos su identificador único en nuestra base de datos. En el caso de que se encontrara, se estaría en el mismo punto que si el usuario ha puesto su nombre_de_usuario/contraseña y ha sido correcto, con lo que procederíamos a dar a entender a la aplicación que el usuario se ha autenticado correctamente en dicha aplicación web.