Secciones bajar

Guía de implantación de OpenID

Por NACHO GUTIÉRREZ (SOITU.ES)
Actualizado 21-05-2008 13:43 CET

Hace unos días anunciamos que soitu.es te daba la opción de autenticarte utilizando OpenID. En este artículo te contamos los pasos que hemos seguido para su implantación en nuestra Web. También te puede servir como guía si estás pensando en implantar OpenID en tu Web en un futuro.

Nuestro punto de partida es una Web [soitu.es] en producción con un sistema de registro y autenticación de usuarios ya existente. Los pasos a seguir serían prácticamente los mismos si se parte de un desarrollo desde cero, ya que implantar un sistema de autenticación OpenID no es muy intrusivo con el código existente. Por supuesto, esto dependerá de cómo esté desarrollada cada Web :).

Modificaciones en la base de datos

El primer paso consiste en adaptar la base de datos de usuarios. Se parte de una tabla de usuarios en la que cada usuario cuenta con un identificador único (clave primaria). Es necesario crear una nueva tabla que asocie a cada usuario con sus posibles identificadores OpenID, creando una relación de uno a muchos entre la tabla de usuarios y esta nueva tabla. Su clave primaria será el identificador OpenID puesto que, obviamente, este identificador debe ser único, ya que no podrá haber dos usuarios que compartan identificador OpenID.

Elección de librería OpenID

Actualmente existen multitud de librerías que dan soporte OpenID tanto de consumer (cliente) como de provider (servidor). Nuestra parte de gestión de usuarios está desarrollada en Perl, así pues, la elección lógica era el módulo Net::OpenID::Consumer disponible en el repositorio de CPAN (de momento, no entra en nuestros planes ofrecer servicios de proveedor OpenID).

A día de hoy, la versión estable de este módulo sólo soporta la especificación 1.1 de OpenID Authentication, lo cual limita el acceso a varios proveedores de OpenID. Entre ellos, se encuentra Yahoo, que ha pasado directamente a soportar la especificación 2.0, ignorando la versión 1.1.

Afortunadamente, el equipo que mantiene este módulo lleva tiempo desarrollando una nueva versión del mismo que sí soporta la especificación 2.0. Decidimos instalar esta versión -no sin algo de miedo ;)- y tras una serie de pruebas comprobamos que su funcionamiento era bastante correcto. No obstante, no deja de ser una versión beta, así que, si notáis cualquier error o funcionamiento extraño, os agradeceremos todos los comentarios que nos hagáis llegar.

Implementando nuestro módulo de gestión de OpenID

Con el módulo ya instalado, necesitamos construir nuestra propia librería para implementar las siguientes acciones:

  • Solicitar autenticación OpenID: la parte fundamental de la librería. A partir de un identificador OpenID proporcionado por el usuario, se encarga de hacer la redirección al proveedor OpenID que gestiona dicho identificador y de procesar su respuesta. Si la autenticación va a ser utilizada en un proceso de alta de usuario, adicionalmente, se solicitará al proveedor OpenID el email y el nickname del usuario para introducirlos automáticamente en el formulario de registro. Esto será posible si el proveedor implementa esta funcionalidad (definida en la extensión OpenID Simple Registration Extension 1.0) y el usuario da explícitamente su permiso.
  • Añadir un identificador OpenID a usuario: asigna un nuevo identificador OpenID a un usuario, comprobando que éste no se encuentre previamente asignado a otro.
  • Obtener el nickname del usuario asociado a un identificador OpenID.
  • Obtener los identificadores OpenID asociados a un nickname de usuario.
  • Eliminar un identificador OpenID de usuario: elimina un identificador OpenID asignado a un usuario, comprobando que éste por lo menos mantenga alguna manera de identificarse, es decir: un usuario solo podrá eliminar un identificador si, además, tiene clave de usuario, o bien, tiene asignado algún identificador OpenID alternativo.
  • Eliminar todos los identificadores OpenID asociados a un usuario, cuando éste se da de baja como usuario de la Web.

El CGI de autenticación OpenID

Una vez implementadas las acciones del punto anterior, es necesario desarrollar el CGI que interactuará con el navegador del usuario. El objetivo de este CGI es proporcionar un interfaz de autenticación OpenID de forma desacoplada de la autenticación tradicional, para evitar confundir a los usuarios. Realiza dos funciones:

  • Si es llamado por el usuario desde el formulario de autenticación OpenID, recibirá como parámetros el identificador OpenID introducido por el usuario, el motivo de la autenticación (inicio de sesión, alta de usuario o añadir nuevo identificador OpenID), y la URL de vuelta donde redirigir al navegador cuando la autenticación sea satisfactoria.
  • Si es llamado por el proveedor OpenID como respuesta a una solicitud de autenticación, recibirá una serie de parámetros que gestiona directamente el módulo Net::OpenID::Consumer para verificar que la autenticación ha tenido éxito. En el caso de alta de usuario, se recibirán adicionalmente los datos de email y nickname, siempre que el usuario dé su autorización.

Adaptación de las páginas existentes

Necesitamos adaptar tres páginas para implantar OpenID:

  • Registro de usuario: en el formulario de alta de usuario se da la posibilidad de utilizar un identificador OpenID en lugar de una contraseña. Para ello, se añade un enlace al CGI de autenticación OpenID. Cuando el usuario se autentique en su proveedor OpenID se retorna a la página de registro de usuario donde aparecerá su identificador en pantalla, en lugar de los campos donde se introduce la contraseña.
  • Inicio de sesión: en el formulario de inicio de sesión, igual que en el caso anterior, se añade un enlace al CGI de autenticación OpenID. Tras autenticarse en su proveedor OpenID se retorna a la página de inicio de sesión para dar por autenticado al usuario.
  • Modificación de perfil: en esta página se muestran los identificadores OpenID que tiene asociados el usuario y se da la posibilidad de eliminarlos o de asociar nuevos identificadores. Se añade un enlace al CGI de autenticación OpenID para añadir nuevos identificadores y se proporciona la funcionalidad de eliminar los identificadores actuales. Es necesario controlar que el usuario no se quede sin clave y sin identificadores OpenID, si no, le dejamos sin posibilidad de autenticarse de nuevo ;) .

Un último detalle

Ciertos proveedores de OpenID tratan de comprobar la legitimidad de la Web que les solicita la autenticación (en este caso, soitu.es) utilizando el protocolo Yadis. Mediante este protocolo comprueban los servicios de identificación que proporciona la Web origen para avisar al usuario sobre su legitimidad. En soitu.es tuvimos que modificar nuestros servidores Web para que insertaran en todas las peticiones la siguiente cabecera:


El contenido del fichero yadis.xrdf define los servicios de autenticación que proporciona la Web y las especificaciones que siguen:


Y... ¡eso es todo! Como ya comentamos anteriormente seguimos investigando temas como OAuth para el intercambio de datos con otras Webs, pero eso es otra guerra. Cada cosa a su tiempo.

Temas relacionados

Selección de temas realizada automáticamente por Autonomy

Di lo que quieras

Aceptar

Si quieres firmar tus comentarios puedes iniciar sesión »

En este espacio aparecerán los comentarios a los que hagas referencia. Por ejemplo, si escribes "comentario nº 3" en la caja de la izquierda, podrás ver el contenido de ese comentario aquí. Así te aseguras de que tu referencia es la correcta. No se permite código HTML en los comentarios.

Di lo que quieras

Lo sentimos, no puedes comentar esta noticia si no eres un usuario registrado y has iniciado sesión.
Si ya lo estás registrado puedes iniciar sesión ahora.

Volver a met Volver a portada
subir Subir al principio de la página