OpenIDOpenID ha sido una impresionante idea para descentralizar y estandarizar las cuentas de usuario de manera que registrándonos en un solo servidor podamos compartir los datos que queramos solo con una URL.
El funcionamiento es sencillo. Un usuario se registra en un servidor openID y pone su el código resultante en su blog, pagina personal, perfil… lo que quiera… o si no tiene simplemente utiliza la dirección del perfil de OpenID. Cuando quiera acceder a algún otro servidor que soporte OpenID, introduce la dirección URL y envía. En ese momento le enviarán a una pagina a partir de la cual el usuario tendrá que poner su contraseña. Una vez autentificado que es el usuario real, el servidor de identidades openID pedirá los datos que crea necesarios para acceder a donde quiera entrar el usuario. Estos datos pueden ser necesarios o opcionales, y puede establecerse una confianza permanente o temporal. Una vez seleccionado el servidor OpenID hace regresar al usuario autenticado a la web de origen.

Este sistema hace que el gran dilema de la seguridad en los sistemas web se simplifique, permitiendo que los ataques, intrusiones y peligros sobre el acceso a datos y zonas restringidas sean un problema menos a tratar nosotros.

La complicación base está en crear el sistema que permita acceder a toda esta información de forma fácil y rápida, y para eso he creado openIdLogin().
La función openIdLogin() utiliza la clase SimpleOpenID para crear un formulario de entrada de la URL, detectar si se produce algún error y dar como resultado los datos del usuario.

A partir de los parámetros de la función podemos lograr una gran personalización. El 1º parámetro indica el nombre del botón enviar del formulario donde introducimos la URL, el 2º El texto del link para crear una nueva OpenID bajo el servidor de Verisign, el 3º indica la dirección de la pagina web en la que se ejecuta la función y el 4º y ultimo la dirección URL a la que regresara el usuario después de aceptar el envió de datos desde el servidor.
Estas dos ultimas variables toman automáticamente los valores del servidor y archivo en el que se están ejecutando si no se pone nada.

OpenID compartidaLa función da como resultado dos tipos de datos. Si hubo un error desconocido dará el valor boleano False, si no da como resultado un array.
Cuando no se ha iniciado ninguna consulta OpenID, la función da un array que contiene las claves text con el texto html del formulario de envió listo para poner directamente en la web y lines, el formulario linea a linea.
Si se realiza alguna consulta y esta resulta errónea por algún motivo la función da como resultado un array con la clave error que contendrá una lista de los errores.
En cambio si todo fue correcto, se da como resultado un array con clave user_data.

PHP:
  1. function openIdLogin($text_login = 'entrar', $text_get_new = 'Crear mi OpenID nueva', $direccion_de_servidor = null, $id_de_regreso = null){
  2.     require_once('class.openid.php');
  3.     if(!($direccion_de_servidor)){  $direccion_de_servidor = 'http://'.$_SERVER['HTTP_HOST'];     }
  4.     if(!($id_de_regreso)){      $id_de_regreso = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']}
  5.     if ($_POST['openid_action'] == "login"){
  6.         // Cogemos la OpenID en formato URL y redirigimos al servidor
  7.         $openid = new SimpleOpenID;
  8.         $openid->SetIdentity($_POST['openid_url']);     // Establecemos la URL de identidad del visitante
  9.         $openid->SetTrustRoot($direccion_de_servidor);        // Establecemos el servidor que pide la autorizacion
  10.         $openid->SetRequiredFields(array('email','fullname'));    // Establecemos los campos obligatorios
  11.         $openid->SetOptionalFields(         // Y estos son los opcionales
  12.             array('dob', 'gender', 'postcode', 'country', 'language', 'timezone')
  13.         );
  14.         if($openid->GetOpenIDServer()){        // Si la apertura no da como resultado algun error
  15.             $openid->SetApprovedURL($id_de_regreso);                // Url de regreso desde el servidor de OpenId
  16.             $openid->Redirect();                                    // Redirigimos al usuario al servidor de OpenId
  17.         } else {                                                    // Si da error lo mostrmos
  18.             return array('error' => $openid->GetError());         // Obtengo los errores
  19.         }
  20.         exit;                                          // Una vez terminado todo salimos del script
  21.     } else if($_GET['openid_mode'] == 'id_res') {           // Si es la respuesta del servidor OpenID
  22.         $openid = new SimpleOpenID;         // Crearemos una peticion HTTP para validar los datos que nos llegan por la URL
  23.         $openid->SetIdentity($_GET['openid_identity']);    // Establecemos la identidad cogiendo el parametro openid_identity desde la URL
  24.         $openid_validation_result = $openid->ValidateWithServer()// Guardamos el resultado de la validadcion
  25.        
  26.         if($openid_validation_result == true){            // Si la identidad es correcta
  27.             return array('user_data' => $_GET);
  28.         } else if($openid->IsError() == true) {      // Si hubo errores
  29.             return array('error' => $openid->GetError());
  30.         } else {   
  31.             return false;                                 // Si la autenticacion no era valida
  32.         }
  33.     } else if ($_GET['openid_mode'] == 'cancel') {          // El usuario cancelo la autorizacion
  34.          return false;
  35.     } else {
  36.         $login = array(
  37.             '   <fieldset id="openid">',
  38.             '      <legend>OpenID</legend>',
  39.             '      <form action="'.$id_de_regreso.'" method="post" onsubmit="this.login.disabled=true;">',
  40.             '         <input type="hidden" name="openid_action" value="login">',
  41.             '         <div>',
  42.             '            <input type="text" name="openid_url" class="openid_login">',
  43.             '            <input type="submit" name="login" value="'.$text_login.'&gt;&gt;">',
  44.             '         </div>',
  45.             '         <div><a href="http://pip.verisignlabs.com/" class="link">'.$text_get_new.'</a></div>',
  46.             '      </form>',
  47.             '   </fieldset>');
  48.         return array('text' => implode("\n", $login), 'lines' => $login);
  49.     }
  50. }

El siguiente ejemplo utiliza la función para mostrar el formulario de petición de datos al servidor openID. Si hay algún error lo salta, y no pone nada directamente. Si se recibe el array de datos del usuario lo muestra al completo.

PHP:
  1. $s = openIdLogin();
  2. if($s){ //si no hay ningun error
  3.     if(isset($s['text'])){  echo $s['text']} // Imprimir el formulario
  4.     if(isset($s['user_data'])){ 
  5.         foreach($s['user_data'] as $key => $valor){
  6.             echo $key.': '.$valor."<br />\n";
  7.         }
  8.     }
  9. }

Para utilizar esta función es necesario tener el archivo "class.openid.php" en la misma carpeta. La función puede ser descargada desde aquí.