pon css en tu vida!

css, html, javascript, php y mucho mas…

Para desarrollar una aplicación basada en los servicios que ofrece Twitter en su API utilizando Zend Framework, podemos utilizar la librería que incluye el framework por defecto, Zend_Service_Twitter.

Sin embargo, utilizar este método nos obliga a solicitar el nombre de usuario y la contraseña a todos aquellos que quieran acceder al servicio. Esta práctica, aparte de estar desaconsejada como se indica en la documentación del API, en un futuro cercano estará obsoleta, y no se permitirá el acceso al API utilizandola.

Para compensarlo, los chicos de Twitter han adoptado OAuth, un estándar abierto que permite la identificación del usuario sin que el servicio externo maneje contraseñas ni otra información sensible requerida para la identificación.

En Zend Framework disponemos desde hace varios meses de Zend_Oauth, un proyecto de Pádraic Brady, que se encuentra todavía en la incubadora, y teóricamente no debería de tardar mucho en dar el salto a la versión final del framework.

Para poder utilizar OAuth en nuestro proyecto basado en Twitter desarrollado con el framework de Zend, debemos:

  1. Registrar nuestra aplicación en Twitter.
  2. Descargar Zend_Oauth del incubator de Zend Framework.

Registrando la aplicación en Twitter.

Para registrar nuestra aplicación en Twitter, debemos hacerlo desde esta página: http://twitter.com/oauth_clients/. Desde allí podremos registrar una nueva aplicación para utilizar el servicio, así como administrar aquellas que ya tenemos registradas.

Registrando-aplicacion-en-twitter

Captura 1. Desde esta página registraremos nuestra aplicación en Twitter para utilizar OAuth para la identificación.

Rellenaremos el formulario, prestando un especial interés en los campos Application Type, Callback URL y Default Access type.

Con Application Type definiremos que tipo de aplicación va a realizar las peticiones de identificación, si una aplicación de escritorio o un servicio web. En nuestro caso lo tenemos bastante fácil: marcaremos Browser.

En Callback URL debemos insertar la url a la que redirigirá Twitter al usuario una vez se ha completado la identificación. Si tan solo queremos hacer unas cuantas pruebas, un http://localhost/oauth-test/ nos bastará. O si jugamos con los Virtual Servers de Apache, podemos crearnos nuestro propio dominio de desarrollo. Algo parecido a http://twitterOauth.dev/.

Default Access type lo marcaremos como Read & Write. Una vez identificados, tendremos que hacer algo para que comprobar que realmente funciona, ¿no? Si elegimos Read-only, no seremos capaces de, por ejemplo, actualizar el timeline del usuario; tan solo podremos recibir información, no enviarla.

Para finalizar, marcamos la opción Use Twitter for login.

Una vez creada la aplicación, podremos ver los datos de conexión que necesitamos para identificarnos a través de OAuth.

datos-aplicacion

Captura 2. Estos son los datos de conexión nuestra aplicación. Los utilizaremos más adelante con Zend_Oauth para identificarnos.

Descargando Zend_Oauth

Con nuestra aplicación ya registrada en el servicio de Twitter, vamos a realizar algunas pruebas desde nuestro proyecto de Zend Framework.

Para ello, debemos descargar Zend_Oauth del repositorio de la incubadora de Zend. Para ello, nos valdremos de cualquier cliente de Subversion. TortoiseSVN para windows o  SCPlugin para Mac OS X, deberían bastarnos.

La url del repositorio para descargar Zend_Oauth es: http://framework.zend.com/svn/framework/standard/incubator/library/Zend/Oauth.

Descargaremos la HEAD Revision, en formato recursivo, para obtener todos los archivos necesarios.

archivos-repositorio

Captura 3. Estos son los archivos y carpetas que componen Zend_Oauth, descargados del repositorio de Zend

Copiamos el archivo Oauth.php y la carpeta Oauth a la librería de Zend, que normalmente está en /library/Zend/.

Doy por supuesto que tienes unos conocimientos mínimos de Zend Framework,y por lo tanto, sabes como crear y configurar un proyecto desde cero. Sino es así, puedes seguir el Quickstart disponible en la documentación que Zend dispone.

Conectando con twitter

A partir de aquí, los pasos son sencillos.Utilizaremos el indexController.php para realizar la conexión.

/**
* Archivo indexController.php
* application/controllers/indexController.php
*/
class indexController extends Zend_Controller_Action
{

public function indexAction()
{

require_once 'Zend/Oauth/Consumer.php';

$options = array(
'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' => '1.0',
'signatureMethod' => 'HMAC-SHA1',
'localUrl' => 'http://twitterOauth.dev/',
'requestTokenUrl' => 'https://twitter.com/oauth/request_token',
'userAuthorisationUrl' => 'https://twitter.com/oauth/authorize',
'accessTokenUrl' => 'https://twitter.com/oauth/access_token',
'consumerKey' => 'CONSUMER_KEY',
'consumerSecret' => 'CONSUMER_SECRET'
);

$consumer = new Zend_Oauth_Consumer($options);

if (!isset($_SESSION['ACCESS_TOKEN'])) {
if (!empty($_GET)) {
$token = $consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']));
$_SESSION['ACCESS_TOKEN'] = serialize($token);
} else {
$token = $consumer->getRequestToken();
$_SESSION['REQUEST_TOKEN'] = serialize($token);
$consumer->redirect();
}
} else {
$token = unserialize($_SESSION['ACCESS_TOKEN']);
// Reinicia el ACCESS_TOKEN cada vez que recargamos
$_SESSION['ACCESS_TOKEN'] = null;
}

$xml = simplexml_load_file('http://twitter.com/users/show.xml?user_id=ID_DEL_USUARIO');
echo var_dump($xml);
}
}

Vamos a repasar el código:

require_once 'Zend/Oauth/Consumer.php';

$options = array(
'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' => '1.0',
'signatureMethod' => 'HMAC-SHA1',
'localUrl' => 'http://twitterOauth.dev/',
'requestTokenUrl' => 'https://twitter.com/oauth/request_token',
'userAuthorisationUrl' => 'https://twitter.com/oauth/authorize',
'accessTokenUrl' => 'https://twitter.com/oauth/access_token',
'consumerKey' => 'CONSUMER_KEY',
'consumerSecret' => 'CONSUMER_SECRET'
);

Cargamos los archivos necesarios para el correcto funcionamiento de Zend_Oauth. En este caso, bastará con el archivo Consumer.php dentro de Zend/Oauth/.
Creamos un array con los datos necesarios para la conexión.
Los datos que necesitamos personalizar con la información que nos proporcionó Twitter cuando registramos la aplicación son:

  • localUrl (l. 7). Donde definiremos la url a la que se redirigirá al usuario una vez completado el proceso de identificación.
  • consumerKey (l. 11) y consumerSecret (l.12) corresponden a los campos con los mismos nombres que nos entrega Twitter (ver captura 2).
$consumer = new Zend_Oauth_Consumer($options);

if (!isset($_SESSION['ACCESS_TOKEN'])) {
if (!empty($_GET)) {
$token = $consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']));
$_SESSION['ACCESS_TOKEN'] = serialize($token);
} else {
$token = $consumer->getRequestToken();
$_SESSION['REQUEST_TOKEN'] = serialize($token);
$consumer->redirect();
}
} else {
$token = unserialize($_SESSION['ACCESS_TOKEN']);
// Reinicia el ACCESS_TOKEN cada vez que recargamos
$_SESSION['ACCESS_TOKEN'] = null;
}

Realizamos la conexión y almacenamos los datos en la sesión. La variable $token almacenará una serie de parámetros con el siguiente formato:

oauth_token = CODIGO_ALFANUM & oauth_token_secret = CODIGO_ALFANUM &  user_id = ID_DEL_USUARIO_LOGUEADO & screen_name = NOMBRE_DEL_USUARIO

Por supuesto, sin espacios entre caracteres. Podremos dividir esta cadena utilizando la función explode() de PHP, para obtener el id del usuario, que deberíamos almacenar en la sesión para futuras consultas a twitter y obtener datos, como por ejemplo, la ficha completa del usuario.

$xml = simplexml_load_file('http://twitter.com/users/show.xml?user_id=ID_DEL_USUARIO');
echo var_dump($xml)

El API de twitter permite obtener los resultados en formato XML o JSON. Para este ejemplo he optado por la vía rápida, y usar simplexml para recoger los valores y mostrarlos. Estar parte es personalmente optimizable por el lector :)

Ahora solo nos queda probar nuestra aplicación. Recomiendo desactivar firewalls y demás protecciones que podamos tener instaladas en nuestro sistema para realizar las pruebas. Personalmente, utilizo Little Snitch para Mac OS X, y no hay forma de realizar la conexión sin desactivarlo.

Si ejecutamos nuestro script, comprobamos que el navegador nos redirige a twitter, donde nos aparecerá el siguiente mensaje, informándonos de la aplicación que solicita nuestra identificación:

autorizacion

Desde la página de Twitter, se nos ofrece información de la aplicación que solicita que nos identifiquemos.

Una vez permitimos el acceso a la aplicación, Twitter nos redirigirá automáticamente de vuelta a la aplicación, con la información justa y necesaria del usuario: su nombre y su id.

de-vuelta

Aún en Twitter, después de identificarnos se nos avisa que nos devuelve, sanos y salvos, a la aplicación de origen.

Ahora, ya podemos realizar todas las consultas necesarias a la API de Twitter.

Cabe resaltar que no podremos utilizar Zend_Service_Twitter si utilizamos el sistema de identificación con OAuth, ya que este necesita del nombre de usuario y contraseña para realizar la conexión. Así que, mientras tanto, deberemos conformarnos con recibir los datos en XML o JSON, según nos sea conveniente.

Esperemos que cuando Zend_Oauth se incorpore definitivamente a Zend Framework, modifiquen el helper de Twitter para poder utilizarlos conjuntamente. Ya estoy impaciente…

2 Comentarios

  1. nohumans el 20.06.10, 21:46

    Gracias, muy bueno ya lo he implementado en mi web.

  2. Joan el 20.06.10, 23:41

    Me alegro de que te haya servido :)

Deja tu comentario