lunes, 1 de febrero de 2010
OpenID con PHP
Vamos a implementar OpenID en nuestra web utilizando la librería PHP OpenID Library de JanRain Inc.. En base a nuestro propio sistema de usuarios daremos la posibilidad de hacer login en nuestra web utilizando una cuenta OpenID.Este artículo es un resumen/traducción del artículo original en inglés Getting Started with OpenID and PHP
Descargamos PHP OpenID Library, para este articulo se ha usado la versión 2.1.1. Luego descomprimimos la carpeta Auth en la raíz de nuestra web.
Nuestra base de datos para almacenar la información de los usuarios tendrá este aspecto
000 |
Nota:
El campo zodiaco se me ha ocurrido como un dato de nuestra DB que OpenID no nos proporciona. Descarga los archivos de ejemplo para ver porque lo he utilizado
El campo zodiaco se me ha ocurrido como un dato de nuestra DB que OpenID no nos proporciona. Descarga los archivos de ejemplo para ver porque lo he utilizado
Utilizamos un formulario básico de login en HTML
000 |
Como ves hay dos formularios. El primero es el clásico formulario con usuario/contraseña. Este formulario envía los datos al archivo login.php que contiene las rutinas generales para autentificar a un usuario. Esto no lo veremos en este articulo pero si en el ejemplo para descargar. El segundo es el formulario de OpenID. Solicita la URL de una cuenta OpenID y envía los datos al archivo openid.php del cual hablamos ahora.
openid.php realiza la petición de autentificación al servidor OpenID
000 |
Destacamos algunas partes importantes del archivo openid.php.
$almacenamiento = new Auth_OpenID_FileStore('./oid_store');
Debemos crear un directorio donde OpenID almacena información necesaria para su funcionamiento. Simplemente crea este directorio y dale permisos de escritura. En este caso, el directorio se llama oid_store
$sreg = Auth_OpenID_SRegRequest::build(array('email', 'fullname'), array('nickname'));
Indicamos la información que queremos obtener de la cuenta de usuario OpenID. Se establece que nickname es un campo obligatorio que el usuario debe tener en su cuenta openID y como opcionales indicamos el email y nombre completo. Otros datos opcionales que podemos obtener son la fecha de nacimiento, país, lenguaje, código postal y zona horaria. Cada uno tiene su propio codigo, así la fecha de nacimiento se indica con dob, el pais con country o el lenguaje con language
$url = $auth->redirectURL($web, $openid_return);
El primer parametro establece la URL de nuestra web y el segundo parámetro la URL del archivo donde finalizará el proceso de autentificación. El archivo openid_return.php será donde el servidor OpenID redigirá al usuario después de verificar su cuenta OpenID, por lo tanto, este archivo es de vital importancia y es nuestra próxima parada en este artículo. las variables $web y $openid_return las podrás ver en el archivo config.php
openid_return.php finaliza el proceso de autentificación, nos indica si se ha realizado login en el servidor OpenID y nos devuelve la información de la cuenta OpenID.
000 |
Como podemos ver en los comentarios de openid_return.php, una vez hemos autentificado con OpenID, en la mayoría de casos, deberemos comprobar si es la primera vez que el usuario utiliza OpenID para acceder a nuestra web, en tal caso deberemos solicitar al usuario que complete los datos de su cuenta en nuestra web. Si nuestra base de datos de usuarios únicamente contiene los campos nick, password e email posiblemente no tengamos que solicitar al usuario otros datos ya y que OpenID nos proporciona éstos (excepto el pass que no tiene porque ser necesario), pero si nuestra base de datos fuera la de una tienda online, por ejemplo, deberemos solicitar al usuario algunos datos que OpenID no nos proporciona, como la dirección postal, el teléfono... etc. Para este caso, he utilizado el campo zodiaco el cual deberá completarse al realizar login por primera vez con OpenID. No obstante, aunque nuestra base de datos únicamente contuviera los campos nick, email y password, podría darse la posibilidad de que el usuario no tuviera establecido un nick en su cuenta OpenID y deberiamos solicitarlo o, aunque tuviera nick, podríamos dar la posibilidad de utilizar un nick diferente en nuestra web.
Como podrás imaginar, en el proceso de autentificación podríamos realizar diferentes opciones dependiendo de nuestra base de datos y de las funcionalidades de nuestra web. Un ejemplo podría ser sourceforge.net. En este articulo no hemos necesitado conocer un password para los usuarios que realizan login con OpenID, pero en sourceforge.net si que solicitan una contraseña la primera vez que realizas login con OpenID debido a que sourceforge.net tiene servicios NO basado en web, como CVS, que requieren una contraseña para ser usados. Haz la prueba, accede a sourceforge.net y haz login con tu OpenID
Así pues, el proceso de autentificación no funciona en base a unos criterios generales sino a la propia funcionalidad de tu web y tu base de datos de usuario. Recuerdo que este articulo se ha escrito suponiendo que tenemos un sistema de usuarios convencional en nuestra web.
Descargar
Descarga los archivos de ejemplo de este tutorial. Incluye los scripts PHP/HTML de este articulo y la versión 2.1.1 de la libreria PHP OpenID Library (solo carpeta Auth). Nota que aunque en esta descarga se ofrezca una copia de la carpeta Auth es necesario que descargues la libreria completa de JanRain Inc. para conocer más sobre ella.
Requisitos de PHP OpenID Library
Para poder hacer funcionar OpenID en nuestro servidor necesitamos lo siguiente:
PHP 4.3.0 o superior
Fsockets o la extensión CURL (preferible CURL)
Extensiones GMP o Bcmath de PHP (se recomienda GMP)
Extensión domxml de PHP
Otros requisitos (como PEAR DB) no son necesarios para este articulo.
Nota:
En sistemas windows la libreria PHP OpenID Library nos puede devolver un error como este:
Fatal error: Define Auth_OpenID_RAND_SOURCE as null to continue with an insecure random number generator. in D:\wamp\www\openid\pweb\Auth\OpenID\CryptUtil.php on line 52
Esto es debido a que esta libreria por defecto intenta utilizar la funcionalidad randomness de los sistemas UNIX para generar numeros aleatorios seguros. Para solucionarlo debemos dirigirnos al archivo Auth\OpenID\CryptUtil.php y cambiar la linea define('Auth_OpenID_RAND_SOURCE', '/dev/urandom'); por define('Auth_OpenID_RAND_SOURCE', null);
En sistemas windows la libreria PHP OpenID Library nos puede devolver un error como este:
Fatal error: Define Auth_OpenID_RAND_SOURCE as null to continue with an insecure random number generator. in D:\wamp\www\openid\pweb\Auth\OpenID\CryptUtil.php on line 52
Esto es debido a que esta libreria por defecto intenta utilizar la funcionalidad randomness de los sistemas UNIX para generar numeros aleatorios seguros. Para solucionarlo debemos dirigirnos al archivo Auth\OpenID\CryptUtil.php y cambiar la linea define('Auth_OpenID_RAND_SOURCE', '/dev/urandom'); por define('Auth_OpenID_RAND_SOURCE', null);
Como saber si nuestro servidor tiene todos los requisitos?
Cuando descargamos la PHP OpenID Library, podemos comprobar si nuestro servidor es apto para utilizar OpenID ejecutando el archivo detect.php. Dicho archivo se encuentra en el directorio openid > examples > consumer > detect.php. No incluido en la descarga de ejemplo.
0 comentarios:
Publicar un comentario