OAuth y Twitter, TwitterOAuth

En el post anterior, Autentica las llamadas a tus API de forma segura, vimos que principalmente hay tres formas de autenticar APIs:

  1. HTTP Basic sobre SSL.
  2. Autenticación basada en token.
  3. Utilizar el protocolo estándar OAuth.

Pues bien, ¿sabías que Twitter asegura su API mediante el protocolo OAuth? Hoy te voy a enseñar cómo puedes poner un botón Twitter Sign In en tu web app, o lo que es lo mismo, un botón de “Entrar con Twitter” para que los usuarios de tu aplicación puedan ejecutar funcionalidad Twitter autenticada desde la misma.

El objetivo es ayudarte a entender el funcionamiento de OAuth a través de la puesta en marcha de este ejemplo práctico, pero desde el punto de vista funcional de consumidor de API.

Implementar OAuth 2.0 en tus propias apps (bajo esta perspectiva tú harías el papel de Twitter, y no de consumidor de API) es algo más complicado que no cubriremos en este artículo. Para ello tendrías que consultar la especificación oficial, disponible aquí, y estudiarla en detalle.

¿Qué es OAuth?

OAuth 2.0 es un protocolo de autenticación abierto con el que las aplicaciones pueden acceder a otros datos publicados por terceros. Se trata de un mecanismo que permite compartir datos entre aplicaciones mediante la implementación del siguiente esquema:

Figura 1. Diagrama OAuth

OAuth maneja los términos propietario del recurso, cliente y servidor para hacer referencia a los tres actores implicados en las transacciones OAuth. En la figura anterior, el Resource Owner es el usuario que se conecta (desde su casa, oficina, etc.) a tu web app (alojada en 1&1, Nominalia, arsys, etc.) a través de Twitter. Client es, pues, tu hoster, y Server es Twitter. El cliente interactúa con el servidor en nombre del propietario del recurso.

El protocolo utiliza tres tipos de credenciales: credenciales de cliente, credenciales temporales, y credenciales de token.

Las credenciales de cliente (consumer key y consumer secret) son las que se utilizan para autenticar al cliente. Esto permite al servidor recoger información acerca de los clientes que utilizan sus servicios, o proporcionar al propietario del recurso más información acerca de los clientes que intentan acceder a los recursos protegidos.

Las credenciales de token representan la concesión de acceso que el propietario del recurso ha dado al cliente para acceder a los recursos protegidos. Estas credenciales las emite el servidor; el cliente no debe conocer el nombre de usuario y la contraseña del propietario del recurso. Con las credenciales de token se evita que el propietario del recurso comparta sus credenciales con el cliente.

Las credenciales de token suelen estar formadas por un identificador -por lo general, aunque no siempre, el identificador es una cadena aleatoria de letras y números única, difícil de adivinar- y un secreto para evitar que el token sea utilizado por otras personas no autorizadas. Suelen estar limitadas en su alcance y duración, y pueden ser revocadas en cualquier momento por el propietario de los recursos sin afectar otras credenciales de tokens emitidos a otros clientes.

En todo caso, para convertirte en un experto OAuth, ¿qué mejor que implementar un ejemplo práctico en PHP donde puedas pelearte tú mism@ con todo eso?

Crea tu app Twitter

Twitter funciona con OAuth. Así que si quieres hacer una web app con el API de Twitter lo primero que necesitas, claro, es tener una cuenta en Twitter. Luego tienes que registrar tu nueva aplicación en https://dev.twitter.com/apps/new

Figura 2. Sign in with your Twitter account

Cuando rellenes el formulario de arriba accederás a otra pantalla donde tienes que definir los detalles de tu nueva app Twitter.

Mira cómo funciona TwitterOAuth

A continuación ya viene “la magia”. Con lo anterior completado ya puedes utilizar TwitterOAuth. Esta es una librería PHP que soluciona la comunicación con el API REST OAuth de Twitter y que, como ves, está disponible en GitHub. Para poner el botón “Entrar con Twitter” en tu app y, por ende, poder ejecutar acciones en nombre del usuario que entra en tu sistema, el siguiente paso es pues, inevitablemente, ¡continuar con la lectura de la documentación de TwitterOAuth!

Comparto contigo ahora mi script de login a Twitter con el TwitterOAuth que tengo yo puesto en una de mis apps. Espero que te sirva de algo y que puedas meterlo tú dentro de tu sistema:

include_once __DIR__ . '/../config/config.php';
include_once __DIR__ . '/../vendors/twitteroauth/twitteroauth.php';

if (empty($_SESSION['twitter']['access_token']) || empty($_SESSION['twitter']['access_token_secret'])) {
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
    $request_token = $connection->getRequestToken(OAUTH_CALLBACK);

    if ($request_token) {
        $_SESSION['twitter'] = array(
            'request_token' => $request_token['oauth_token'],
            'request_token_secret' => $request_token['oauth_token_secret'],
        );

        switch ($connection->http_code) {
            case 200:
                $url = $connection->getAuthorizeURL($request_token['oauth_token']);
                // redirect to Twitter
                header('Location: '.$url);
                break;
            default:
                echo 'Coonection with twitter Failed';
                break;
        }
    } else {
        echo 'Error Receiving Request Token';
    }
} else {
    header('Location: http://'.BASE_URL);
}

exit;

La documentación de TwitterOAuth está muy bien, además el fichero test.php tiene un montón de métodos de prueba para que puedas hacerte una idea de qué tiene este API, cómo se utiliza, etc.