<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pon css en tu vida! &#187; OAuth</title>
	<atom:link href="http://blog.joanfernandez.es/tag/oauth/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.joanfernandez.es</link>
	<description>css, html, javascript, php y mucho mas...</description>
	<lastBuildDate>Wed, 15 Sep 2010 08:23:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Login en Twitter con Zend Framework y Zend_Oauth.</title>
		<link>http://blog.joanfernandez.es/2009/07/login-en-twitter-con-zend-framework-y-zend_oauth/</link>
		<comments>http://blog.joanfernandez.es/2009/07/login-en-twitter-con-zend-framework-y-zend_oauth/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 06:00:11 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Zend_Oauth]]></category>

		<guid isPermaLink="false">http://blog.joanfernandez.es/?p=229</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Para desarrollar una aplicación basada en los servicios que ofrece <strong>Twitter</strong> en su API utilizando <a title="Zend Framework" href="http://framework.zend.com/" hreflang="en-US">Zend Framework</a>, podemos utilizar la librería que incluye el framework por defecto, <a title="Zend_Service_Twitter" href="http://framework.zend.com/manual/en/zend.service.twitter.html" hreflang="en-US">Zend_Service_Twitter</a>.</p>
<p>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<a title="API de Twitter | Security Best Practices" href="http://apiwiki.twitter.com/Security-Best-Practices#PasswordRetention" hreflang="en-US"> documentación del API</a>, en un futuro cercano estará obsoleta, y no se permitirá el acceso al API utilizandola.</p>
<p>Para compensarlo, los chicos de Twitter han adoptado <a title="OAuth" href="http://oauth.net/" hreflang="en-US">OAuth</a>, un estándar abierto que permite la identificación del usuario sin que el servicio externo maneje contraseñas ni otra información <em>sensible</em> requerida para la identificación.</p>
<p>En <strong>Zend Framework</strong> disponemos desde hace varios meses de <a title="Zend_Oauth" href="http://framework.zend.com/wiki/pages/viewpage.action?pageId=37957" hreflang="en-US">Zend_Oauth</a>, un proyecto de <strong>Pádraic Brady</strong>, que se encuentra todavía en la <a title="Zend Framework Incubator" href="http://framework.zend.com/svn/framework/standard/incubator/" hreflang="en-US">incubadora</a>, y teóricamente no debería de tardar mucho en dar el salto a la versión final del framework.</p>
<p><span id="more-229"></span></p>
<p>Para poder utilizar OAuth en nuestro proyecto basado en Twitter desarrollado con el framework de Zend, debemos:</p>
<ol>
<li>Registrar nuestra aplicación en Twitter.</li>
<li>Descargar Zend_Oauth del <em>incubator</em> de Zend Framework.</li>
</ol>
<h3>Registrando la aplicación en Twitter.</h3>
<p>Para registrar nuestra aplicación en Twitter, debemos hacerlo desde esta página: <a title="OAuth Twitter Clients" href="http://twitter.com/oauth_clients/new" hreflang="en-US">http://twitter.com/oauth_clients/</a>. Desde allí podremos registrar una nueva aplicación para utilizar el servicio, así como administrar aquellas que ya tenemos registradas.</p>
<div id="attachment_235" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-235" title="Registrando-aplicacion-en-twitter" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/Registrando-aplicacion-en-twitter.jpg" alt="Registrando-aplicacion-en-twitter" width="550" height="339" /><p class="wp-caption-text">Captura 1. Desde esta página registraremos nuestra aplicación en Twitter para utilizar OAuth para la identificación.</p></div>
<p>Rellenaremos el formulario, prestando un especial interés en los campos <strong>Application Type, Callback URL</strong> y <strong>Default Access type</strong>.</p>
<p>Con <strong>Application Type </strong>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 <strong>Browser</strong>.</p>
<p>En <strong>Callback URL</strong> 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 <strong>http://localhost/oauth-test/</strong> nos bastará. O si jugamos con los Virtual Servers de Apache, podemos crearnos nuestro propio dominio de desarrollo. Algo parecido a<strong> http://twitterOauth.dev/</strong>.</p>
<p><strong>Default Access type</strong> lo marcaremos como Read &amp; 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.</p>
<p>Para finalizar, marcamos la opción <strong>Use Twitter for login</strong>.</p>
<p>Una vez creada la aplicación, podremos ver los datos de conexión que necesitamos para identificarnos a través de OAuth.</p>
<div id="attachment_239" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-239" title="datos-aplicacion" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/datos-aplicacion.jpg" alt="datos-aplicacion" width="550" height="339" /><p class="wp-caption-text">Captura 2. Estos son los datos de conexión nuestra aplicación. Los utilizaremos más adelante con Zend_Oauth para identificarnos.</p></div>
<p style="text-align: center;">
<h3>Descargando Zend_Oauth</h3>
<p>Con nuestra aplicación ya registrada en el servicio de Twitter, vamos a realizar algunas pruebas desde nuestro proyecto de Zend Framework.</p>
<p>Para ello, debemos descargar Zend_Oauth del repositorio de la incubadora de Zend. Para ello, nos valdremos de cualquier cliente de Subversion. <em>TortoiseSVN</em> para windows o  <em>SCPlugin</em> para Mac OS X, deberían bastarnos.</p>
<p>La url del repositorio para descargar Zend_Oauth es: <a href="http://framework.zend.com/svn/framework/standard/incubator/library/Zend/Oauth" hreflang="en-US">http://framework.zend.com/svn/framework/standard/incubator/library/Zend/Oauth</a>.</p>
<p>Descargaremos la <em>HEAD Revision</em>, en formato recursivo, para obtener todos los archivos necesarios.</p>
<div id="attachment_241" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-241" title="archivos-repositorio" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/archivos-repositorio.jpg" alt="archivos-repositorio" width="550" height="234" /><p class="wp-caption-text">Captura 3. Estos son los archivos y carpetas que componen Zend_Oauth, descargados del repositorio de Zend</p></div>
<p>Copiamos el archivo Oauth.php y la carpeta Oauth a la librería de Zend, que normalmente está en <em>/library/Zend/</em>.</p>
<p>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 <a title="Zend Framework Quickstart" href="http://framework.zend.com/docs/quickstart" hreflang="en-US">Quickstart</a> disponible en la documentación que Zend dispone.</p>
<h3>Conectando con twitter</h3>
<p>A partir de aquí, los pasos son sencillos.Utilizaremos el <em>indexController.php</em> para realizar la conexión.</p>
<pre class="brush: php;">
/**
* 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' =&gt; Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' =&gt; '1.0',
'signatureMethod' =&gt; 'HMAC-SHA1',
'localUrl' =&gt; 'http://twitterOauth.dev/',
'requestTokenUrl' =&gt; 'https://twitter.com/oauth/request_token',
'userAuthorisationUrl' =&gt; 'https://twitter.com/oauth/authorize',
'accessTokenUrl' =&gt; 'https://twitter.com/oauth/access_token',
'consumerKey' =&gt; 'CONSUMER_KEY',
'consumerSecret' =&gt; 'CONSUMER_SECRET'
);

$consumer = new Zend_Oauth_Consumer($options);

if (!isset($_SESSION['ACCESS_TOKEN'])) {
if (!empty($_GET)) {
$token = $consumer-&gt;getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']));
$_SESSION['ACCESS_TOKEN'] = serialize($token);
} else {
$token = $consumer-&gt;getRequestToken();
$_SESSION['REQUEST_TOKEN'] = serialize($token);
$consumer-&gt;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);
}
}
</pre>
<p>Vamos a repasar el código:</p>
<pre class="brush: php;">
require_once 'Zend/Oauth/Consumer.php';

$options = array(
'requestScheme' =&gt; Zend_Oauth::REQUEST_SCHEME_HEADER,
'version' =&gt; '1.0',
'signatureMethod' =&gt; 'HMAC-SHA1',
'localUrl' =&gt; 'http://twitterOauth.dev/',
'requestTokenUrl' =&gt; 'https://twitter.com/oauth/request_token',
'userAuthorisationUrl' =&gt; 'https://twitter.com/oauth/authorize',
'accessTokenUrl' =&gt; 'https://twitter.com/oauth/access_token',
'consumerKey' =&gt; 'CONSUMER_KEY',
'consumerSecret' =&gt; 'CONSUMER_SECRET'
);
</pre>
<p>Cargamos los archivos necesarios para el correcto funcionamiento de Zend_Oauth. En este caso, bastará con el archivo Consumer.php dentro de Zend/Oauth/.<br />
Creamos un array con los datos necesarios para la conexión.<br />
Los datos que necesitamos personalizar con la información que nos proporcionó Twitter cuando registramos la aplicación son:</p>
<ul>
<li><strong>localUrl (<acronym title="Línea 7">l. 7</acronym>)</strong>. Donde definiremos la url a la que se redirigirá al usuario una vez completado el proceso de identificación.</li>
<li><strong>consumerKey (<acronym title="Línea 11">l. 11</acronym>)</strong> y <strong>consumerSecret (<acronym title="Línea 12">l.12</acronym>)</strong> corresponden a los campos con los mismos nombres que nos entrega Twitter (ver captura 2).</li>
</ul>
<pre class="brush: php;">
$consumer = new Zend_Oauth_Consumer($options);

if (!isset($_SESSION['ACCESS_TOKEN'])) {
if (!empty($_GET)) {
$token = $consumer-&gt;getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']));
$_SESSION['ACCESS_TOKEN'] = serialize($token);
} else {
$token = $consumer-&gt;getRequestToken();
$_SESSION['REQUEST_TOKEN'] = serialize($token);
$consumer-&gt;redirect();
}
} else {
$token = unserialize($_SESSION['ACCESS_TOKEN']);
// Reinicia el ACCESS_TOKEN cada vez que recargamos
$_SESSION['ACCESS_TOKEN'] = null;
}
</pre>
<p>Realizamos la conexión y almacenamos los datos en la sesión. La variable <strong>$token</strong> almacenará una serie de parámetros con el siguiente formato:</p>
<p>oauth_token = <em>CODIGO_ALFANUM</em> &amp; oauth_token_secret = <em>CODIGO_ALFANUM</em> &amp;  user_id = ID_DEL_USUARIO_LOGUEADO &amp; screen_name = <em>NOMBRE_DEL_USUARIO</em></p>
<p>Por supuesto, sin espacios entre caracteres. Podremos dividir esta cadena utilizando la función <a title="función explode() PHP" href="http://es.php.net/explode" hreflang="es-ES">explode()</a> 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.</p>
<pre class="brush: php;">
$xml = simplexml_load_file('http://twitter.com/users/show.xml?user_id=ID_DEL_USUARIO');
echo var_dump($xml)
</pre>
<p>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 <a title="SimpleXML" href="http://php.net/manual/en/ref.simplexml.php" hreflang="en-US">simplexml</a> para recoger los valores y mostrarlos. Estar parte es personalmente optimizable por el lector <img src='http://blog.joanfernandez.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ahora solo nos queda probar nuestra aplicación. Recomiendo <strong>desactivar firewalls y demás protecciones que podamos tener instaladas en nuestro sistema</strong> para realizar las pruebas. Personalmente, utilizo Little Snitch para Mac OS X, y no hay forma de realizar la conexión sin desactivarlo.</p>
<p>Si ejecutamos nuestro script, comprobamos que el navegador nos redirige a twitter, donde nos aparecerá el siguiente mensaje, <strong>informándonos de la aplicación que solicita nuestra identificación</strong>:</p>
<div id="attachment_251" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-251" title="autorizacion" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/autorizacion.jpg" alt="autorizacion" width="550" height="234" /><p class="wp-caption-text">Desde la página de Twitter, se nos ofrece información de la aplicación que solicita que nos identifiquemos.</p></div>
<p>Una vez permitimos el acceso a la aplicación, <strong>Twitter nos redirigirá automáticamente de vuelta a la aplicación</strong>, con la información justa y necesaria del usuario: su nombre y su id.</p>
<div id="attachment_252" class="wp-caption aligncenter" style="width: 560px"><img class="size-full wp-image-252" title="de-vuelta" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/de-vuelta.jpg" alt="de-vuelta" width="550" height="234" /><p class="wp-caption-text">Aún en Twitter, después de identificarnos se nos avisa que nos devuelve, sanos y salvos, a la aplicación de origen.</p></div>
<p>Ahora, ya podemos realizar todas las consultas necesarias a la API de Twitter.</p>
<p>Cabe resaltar que <strong>no podremos utilizar Zend_Service_Twitter si utilizamos el sistema de identificación con OAuth</strong>, 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.</p>
<p>Esperemos que cuando Zend_Oauth se incorpore definitivamente a Zend Framework, modifiquen el helper de Twitter para poder utilizarlos conjuntamente. Ya estoy impaciente&#8230;</p>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://blog.joanfernandez.es/2009/07/login-en-twitter-con-zend-framework-y-zend_oauth/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

