OAuth con Twitter

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

Tutorial sobre OAuth

Diagrama de autorización OAuth sobre Twitter

Registro de la Aplicación Cliente (consumer)

  • Cuando una aplicación cliente solicita acceso a los recursos en un proveedor (como por ejemplo Twitter), la aplicación cliente lo primero que tiene que obtener es una concesión de autorización.
  • Antes de que la aplicación solicite acceso a un recurso (por ejemplo los datos personales de un usuario en twitter, su timeline, sus followers, etc..), esta aplicación cliente debe registrarse primero en el servidor de autorización (provider) asociado con esos recursos.
  • Este tipo de registro se suele hacer en la página de Twitter en https://apps.twitter.com/ y suele ser válido hasta que la persona que registró dicha aplicación la revoque. Twitter nos facilitará en la página mencionada anteriormente el Consumer Key y el Consumer Secret.
  • Si una aplicación se registra con múltiples servidores de autorización (Facebook, Twitter, Google..), cada uno de ellos facilitará su Consumer Key y Consumer Secret específico.
  • Cuando la aplicación cliente solicita acceso a los recursos, esta aplicación cliente primeramente necesita conectarse enviando el Consumer Key y el Consumer Secret que la identifica como aplicación en Twitter(provider).
  • En la fase de registro en Twitter https://apps.twitter.com de nuestra aplicación cliente, también tenemos que registrar una URL. Esta URL de redireccionamiento (callback) es utilizada cuando un usuario ha concedido permiso a nuestra aplicación cliente para acceder a los recursos específicos (generalmente datos personales del usuario, lectura de timeline, escritura en timeline, etc..). En esta dirección de callback nuestra aplicación se encargará de finalizar el proceso de autenticación.

Fase de Autorización

  • La concesión de autorización es dada a la aplicación cliente por el propietario del recurso (el usuario de Twitter que nos da permiso para acceder a sus datos), en cooperación con el servidor de autorización (provider) asociado al servidor de recursos.
  • La autenticación OAuth es el proceso en el cuál un Usuario concede accesos a sus recursos protegidos sin tener que compartir sus credenciales (usuario y contraseña) con la aplicación Cliente (consumer). OAuth utiliza Tokens generados por el Provider (Twitter) en lugar de utilizar las credenciales del usuario. Este proceso utiliza 2 tipos de Token:
  • Request Token: utilizado por la aplicación Cliente (consumer) para preguntar al Usuario si autoriza el acceso a sus recursos Protegidos. El Token autorizado por el Usuario se cambiará por un Access Token. Este Request Token solamente se utiliza una ÚNICA vez y no debe ser utilizado para otro propósito. Se recomienda que los Request Token tengan una vida limitada. Un símil de Request Token podría ser el de una "Tarjeta Temporal de Acceso al Sistema".
  • Access Token: utilizado por la aplicación Cliente (consumer) para acceder los recursos protegidos en nombre del usuario. Los Access Token pueden limitar el acceso a ciertos recursos protegidos, y pueden tener también una vida limitada. Los proveedores deberían permitir a los Usuarios el revocar Access Tokens concedidos a cualquier aplicación (consumer). Solamente los Access Token deberían usarse para acceder a los Recursos protegidos. Un símil de Access Token podría ser el de una "Tarjeta Definitiva de Acceso al Sistema en nombre del usuario".

La Autenticación OAuth se hace en tres pasos generales:

  • El consumer obtiene un Request Token sin autorizar.
  • El usuario autoriza ese Request Token.
  • El consumer intercambia ese Request Token por un Access Token.


Explicación detallada del proceso de obtención del Código de Autorización

1.- Un propietario de un recurso (un usuario de Twitter por ejemplo) accede a la aplicación cliente (nuestra página web).

2.- Nuestra página web se conecta a Twitter enviando su identificación de aplicación (Consumer Key y Consumer Secret). El proveedor verifica esos datos y si son correctos genera un Request Token y un Request Token Secret que devuelve a la aplicación cliente. Podríamos decir que ese Request Token y Request Token Secret equivalen a un usuario sin identifica en Twitter. Twitter se asegurará que el Request Token no podrá ser cambiado por un Access Token hasta que el Usuario autorice el acceso.

3.- La aplicación cliente le indica a ese usuario que tiene que acceder al servidor de autorización (ejemplo Facebook, Twitter, Google..)

4.- Para hacer login en el servidor de autorización, el usuario es redireccionado a dicho servidor por la aplicación cliente. La aplicación cliente envía al servidor de autorización además el Request Token.

5.- El usuario hace login en el servidor de autorización y éste le pregunta si quiere conceder permisos de acceso a sus recursos por la aplicación cliente. Si el usuario acepta será redireccionado de vuelta a la aplicación cliente a la dirección de callback registrada en Twitter para esa aplicación.

6.- Cuando se redirecciona de vuelta a la aplicación cliente, el servidor de autorización envía además de vuelta el Request Token y un Código de Verificación que representa la autorización concedida.

7.- Cuando accedemos a URL de callback, la aplicación cliente conecta directamente con el servidor de autorización enviando su Consumer Key, Consumer Secret, Request Token y Request Token Secret.

8.- Si el servidor de autorización acepta esos valores, entonces se solicitará el intercambio de los Request Token por los Access Token y para eso se envía el 'Código de Verificación' obtenido en el paso 6. El servidor nos devolverá como respuesta un Access Token y Access Token Secret que identificarán a ese usuario en Twitter.

9.- La aplicación cliente podrá a partir de ahora usar el Access Token para acceder a los recursos protegidos de ese usuario. El Access Token sirve tanto para la autenticación de la aplicación cliente, como para identificar el Usuario y para la Autorización de acceso a los recursos de ese Usuario.


Aquí vemos el Diagrama de Autenticación que se realiza para la autorización del acceso a Twitter desde una aplicación externa.


Diagrama-OAuth-Twitter.jpg

Autenticación con Twitter

Si tenemos por ejemplo una aplicación creada en PHP y queremos que nuestros usuarios se autentiquen contra Twitter, podremos utilizar la siguiente librería que nos permite realizar todo el proceso mencionado en el diagrama de autorización de una manera más cómoda y sencilla, y además dispone de una amplia librería de métodos y funciones para trabajar con Twitter (muy recomendable).

https://github.com/abraham/twitteroauth https://twitteroauth.com/

Los pasos necesarios previos al uso de la librería son los siguientes:

  • Crear una carpeta para nuestra aplicación en nuestro dominio.
  • Descargarse la librería de twitteroauth de abraham desde Github: twitteroauth.
  • Del .zip descargado necesitaremos la carpeta twitteroauth y el example.php, que copiaremos a nuestra carpeta en el dominio.
  • Crear una aplicación en Twitter: https://apps.twitter.com/
  • Configurar todos los parámetros necesarios.
  • Activar la Lectura/Escritura para nuestra aplicación en Twitter (si fuera necesario hay que hacerlo configurando nuestra cuenta de twitter en el el teléfono, desde la aplicación móvil).
  • Activar Permitir Autenticación con esta aplicación.
  • Generar los Access Token para la aplicación.
  • Guardar los datos de acceso obtenidos desde la web de Twitter y configurarlos en nuestra aplicación.
  • Configurar los datos de la aplicación:
  • Utilizar la API REST de Twitter deseada para hacer las peticiones deseadas.
  • Utilizar GET o POST dependiendo de la petición.

Librería sencilla PHP para trabajar con Twitter

Si en cambio no queremos complicarnos y no necesitamos realizar autenticación de usuarios, podremos utilizar una librería más sencilla que nos dejará utilizar la API REST de Twitter para publicar y consultar lo que deseemos.

https://github.com/ricardoper/TwitterOAuth

Los pasos necesarios previos al uso de la librería son los siguientes:

  • Crear una carpeta para nuestra aplicación en nuestro dominio.
  • Descargarse la librería de TwitterOAuth de ricardoper desde Github: TwitterOAuth.
  • Del .zip descargado necesitaremos la carpeta TwitterOauth que contiene la librearía. El fichero example.php nos servirá como modelo de ejemplo de uso de la librería.
  • Crear una aplicación en Twitter: https://apps.twitter.com/
  • Configurar todos los parámetros necesarios.
  • Activar la Lectura/Escritura para nuestra aplicación en Twitter (si fuera necesario hay que hacerlo configurando nuestra cuenta de twitter en el el teléfono, desde la aplicación móvil).
  • Generar los Access Token para la aplicación.
  • Guardar los datos de acceso obtenidos desde la web de Twitter y configurarlos en nuestra aplicación.
  • Configurar los datos de la aplicación:
    • Los oauth_token son los access_token y access_token_secret.
    • Los consumer_ son los API key y secret
  • Utilizar la API REST de Twitter deseada para hacer las peticiones deseadas.
  • Configurar los parámetros de la petición y utilizar GET o POST dependiendo de la petición.

Código de ejemplo de aplicación que usa Twitter Oauth 1.1 de Abraham

Página de Configuración de OAuth para Twitter

<?php
const CONSUMER_KEY = 'lEUjF13dmQsV7cS9klalEUjF13dm1';
const CONSUMER_SECRET = 'YIalEUjF13dmziXQWe7lEUjF13dmOAHTv07nlEUjF13dmi3lFFglEUjF13dmd';
const OAUTH_CALLBACK = 'http://www.veiga.local/OAuthTwitter/callback.php';

Login en Twitter con OAuth

  • Fichero login.php:
<?php
@session_start();

require "autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

// Cargamos la configuración de Twitter.
require('config.php');

//echo "<h1>Autenticación OAuth con Twitter</h1>";

// Hacemos la conexión a Twitter usando el Consumer_key y el Consumer_Secret.
$conexion = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);

// Solicitamos el Request Token que identificará a la aplicación en Twitter.
// ATENCIÓN !!! : en Twitter el Request Token se llama Oauth Token.

// Este token es válido solamente para un único uso
// Se necesita un consumer_key y consumer_secret para solicitar ese token.
$request_token = $conexion->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));
//print_r($request_token);

// Los almacenamos en una variable de sesión.
$_SESSION['oauth_token'] = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
  
// Una vez que ya tenemos los oauth_token y oauth_token_secret.
// Ahora es el paso de la autenticación del usuario.

// Necesitamos que el usuario se autentique en Twitter y permitir el acceso a la aplicación.
// En $url tenemos la url de autenticación dónde se le pasa el oauth_token.
$url = $conexion->url('oauth/authorize', array('oauth_token' => $request_token['oauth_token']));

// Creamos el hiperenlace para que el usuario se autentique.
// Cuando se haya producido la autenticación Twitter nos devolverá a la página callback.php
// que hemos definido en la petición del Request_token
// Y nos devolverá un oauth_token y oauth_verifier. 

//echo "<br/><a href='$url'><img src='https://twitteroauth.com/images/sign-in-with-twitter-link.png'></a>";

header("location: $url");

Callback desde Twitter con OAuth

  • Fichero callback.php:
<?php
@session_start();

require "autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

// Cargamos la configuración de Twitter.
require('config.php');

// En la página de callback comprobamos si el oauth token que nos devuelve en el callback desde Twitter
//  coincide con el que tenemos grabado en la variable de sesión.
if (isset($_REQUEST['oauth_token']) && $_REQUEST['oauth_token'] !== $_SESSION['oauth_token']) {
    die('Error en la autenticación');
}

// Si llega aquí se supone que el usuario se ha autenticado correctamente y solamente
// nos falta intercambiar los request_token de la aplicación por los access_token 
// que nos permitirán acceder a Twitter como ese usuario recién autenticado.
// Estos datos son los que tendríamos que almacenar si quisiéramos por ejemplo 
// publicar en Twitter con ese usuario en cualquier momento.

// Creamos de nuevo la conexión a Twitter pero en este caso pasando 
// el request_token y request_token_secret para intercambiarlos por los access token y access token secret.
$conexion = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

// Obtenemos finalmente los Access Token en las variables oauth_token y oauth_token_secret
$access_token = $conexion->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier']));

// Ahora es cuando guardaríamos en la base de datos o en una sesión los access_token y access_token_secret de ese usuario.
$_SESSION['access_token'] = $access_token['oauth_token'];
$_SESSION['access_token_secret'] = $access_token['oauth_token_secret'];
$_SESSION['usuario_twitter'] = $access_token['screen_name'];

//echo $_SESSION['access_token']['screen_name'];
if (isset($_SESSION['pagina']))
	header("location: {$_SESSION['pagina']}");
else
	echo "<h2>Autenticación realizada con éxito.</h2>";

//print_r($access_token);

TimeLine en Twitter con OAuth

  • Fichero estados.php:
<?php
@session_start();

require "autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

// Cargamos la configuración de Twitter.
require('config.php');

$_SESSION['pagina'] = $_SERVER['REQUEST_URI'];

if (!isset($_SESSION['access_token']))
	header('location: login.php');
else
{
	// Enviamos cabecera UTF-8
	header('Content-type:text/html; charset=utf-8');

	// Obtenemos el access_token y access_token_secret.
	// En este caso los sacamos de la variable de sesión.
	$access_token = $_SESSION['access_token'];
	$access_token_secret = $_SESSION['access_token_secret'];

	// Comenzamos a hacer una petición API.
	$conexion = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token, $access_token_secret);
	$content = $conexion->get("account/verify_credentials");

	// Referencia de la API de Twitter: https://dev.twitter.com/rest/reference/get/statuses/user_timeline
	$mensajesEstado = $conexion->get("statuses/user_timeline", array("count" => 25, "exclude_replies" => true));

	//print_r($mensajesEstado);

	echo "<h1>TimeLine en Twitter de \"{$_SESSION['usuario_twitter']}\"</h1>";

	echo '<ul>';
	for ($i=0;$i<count($mensajesEstado);$i++)
	{
		echo '<li>'.$mensajesEstado[$i]->text."</li>";
	}
	echo '</ul>';
}

Publicar en Twitter con OAuth

  • Fichero publicar.php:
<?php
@session_start();

require "autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

// Cargamos la configuración de Twitter.
require('config.php');

$_SESSION['pagina'] = $_SERVER['REQUEST_URI'];

// Si no tenemos el access token lo solicitamos redireccionando al login.php
if (!isset($_SESSION['access_token']))
	header('location: login.php');
else
{
	// Enviamos cabecera UTF-8
	header('Content-type: text/html; charset=utf-8');

	// Obtenemos el access_token y access_token_secret.
	// En este caso los sacamos de la variable de sesión.
	$access_token = $_SESSION['access_token'];
	$access_token_secret = $_SESSION['access_token_secret'];

	// Creamos la conexión con Twitter
	$conexion = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token, $access_token_secret);

	// Si recibimos una actualización de estado lo publicamos.
	if (!empty($_POST['estado']))
	{
		$conexion->post('statuses/update',array('status'=>$_POST['estado']));
		echo "<h2>Su post se ha publicado en Twitter correctamente.</h2>";
		echo "<a href='publicar.php'>Volver</a>";
	}
	else // Mostramos el formulario 
	{
		echo '
		<h3>Publicación de mensajes en tu cuenta de Twitter</h3>
		<form method="post">
			<label for="estado">Mensaje</label>
			<input type="text" class="form-control" id="estado" name="estado" placeholder="Escriba aquí su mensaje de Twitter.">
			<button type="submit">Publicar Tweet</button>
		</form>';
	}
}

--Veiga (discusión) 00:10 13 may 2015 (CEST)