Cómo autenticar usuarios con redes sociales en PHP

Inicio / Cómo hacer para... / Cómo autenticar usuarios con redes sociales en PHP

Algo que se ha puesto bastante de moda últimamente es la posibilidad de logearse en un sitio cualquiera usando un usuario creado para otro (Por ejemplo, logearte a StackOverflow usando tu Gmail o a Clarin usando tu Facebook).

Este enfoque presenta varias ventajas:

  1. Para el usuario significa no tener que inventar (¡y recordar!) una contraseña más y, por si eso fuera poco, ingresar a tu sitio haciendo un solo click.
  2. Para el sitio significa no tener que almacenar información de usuarios ni hacer un doble-opt-in (Se asume que el proveedor de autenticación ya ha validado la identidad del usuario).

Ahora bien, desde el punto de vista de tu aplicación… ¿cómo podés implementar esto?

La mayoría de los grandes proveedores de autenticación (Gmail, Facebook, Twitter, etc…) utilizan un protocolo que se conoce como OAuth, muy seguro pero algo complejo de implementar a mano.

Afortunadamente existen algunas librerías que hacen el trabajo sucio por nosotros. Veamos algunas:

HybridAuth

Esta librería (Puede consultarse la documentación acá) ofrece muchas posibilidades además del login (Compartir en redes sociales, acceso a perfiles, etc…).

Como de costumbre, el uso recomendado es mediante Composercomposer init y después (si no incluiste la dependencia interactivamente) composer require hybridauth/hybridauth

En definitiva, el archivo composer.json debería quedar similar a:

{
 "name": "leeway/hybrid_auth",
 "description": "Test de hybrid_auth",
 "require": {
 "hybridauth/hybridauth": "^2.10"
 },
 "authors": [
 {
 "name": "Mauro Chojrin",
 "email": "mauro.chojrin@leewayweb.com"
 }
 ]
}

Luego, instalamos las dependencias usando composer install y estamos listos para comenzar nuestra aplicación.

HybridAuth provee una clase principal: Hybrid_Auth.

Lo primero que vamos a necesitar hacer es, obviamente, crear una instancia de esta clase. El parámetro que recibe el constructor es la configuración.

Esta configuración tiene una cantidad de parámetros, algunos opcionales y otros obligatorios. Los básicos son:

  • base_url URL a donde el proveedor (Google, Facebook, Twitter, etc…) redireccionará una vez realizada la autenticación. A esta URL se la conoce como callback
  • providers Lista de proveedores que quieras usar (¡Claro que deben estar soportados por la librería!).
    • enabled true o false
    • keys Credenciales de acceso para tu aplicación:
      • id Identificación de tu aplicación
      • key Clave de acceso
      • secret Clave secreta

Las credenciales de acceso las debes generar en cada proveedor (Puedes ver cómo hacerlo para Facebook siguiendo este enlace, para Google este y para Twitter este).

Veamos un ejemplo:

<?php

return [
        'base_url' => 'http://localhost:8080/vendor/hybridauth/hybridauth/hybridauth/',
        'providers' => [
                        'Facebook' => [
                                'enabled' => true,
                                'keys' => [
                                        'id' => 'XXXX',
                                        'secret' => 'YYYY',
                                ]
                        ]
                ],
];

Aquí lo importante es (más allá de la identificación de mi app en particular), la dirección a la que Facebook (o el proveedor de autenticación) deberá realizar su callback (En mi caso es una dirección que comienza con http://localhost:8080 porque estoy desarrollando una prueba de concepto usando el servidor embebido en PHP, si fuera un sitio productivo habría que escribir el dominio).

Sin entrar en los detalles de OAuth (U OpenID que a los efectos de este artículo no distan mucho), el ciruito de autenticación implica dejar por un momento nuestro sitio para pedirle al usuario que realice un login en otro y, una vez logrado esto, vuelva.

Toda esta complejidad precisamente la maneja HybridAuth a través del archivo vendor/hybridauth/hybridauth/hybridauth/index.php cuyo contenido no es más que:

<?php
/**
* HybridAuth
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
* (c) 2009-2015, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
*/

// ------------------------------------------------------------------------
//      HybridAuth End Point
// ------------------------------------------------------------------------

require_once( "Hybrid/Auth.php" );
require_once( "Hybrid/Endpoint.php" );

Hybrid_Endpoint::process();

Obviamente toda la magia está en el método Hybrid_Endpoint::process();el cual, una vez validada la autenticación volverá a redirigir al visitante hacia la página en la que se solicitó la autenticación.

En mi ejemplo sería el archivo login.php:

<?php

require_once __DIR__.'/vendor/autoload.php';

session_start();
$config = require_once 'config.php';

$ha = new Hybrid_Auth( $config );

try {
        $facebook = $ha->authenticate( 'facebook' );
        $user_profile = $facebook->getUserProfile();

        echo 'UserProfile: '.print_r($user_profile, 1);
} catch ( Exception $e ) {
        echo $e->getMessage();
}

Al cual se accede desde login.html:

<html>
        <form>
                <fieldset>
                        <legend>Identif&iacute;cate con tu Facebook</legend>
                            <a href="login.php">Autorizar</a>
                </fieldset>
        </form>
</html>

 

¿Quedó alguna duda? ¡Espero tus comentarios!

mchojrin

Director Académico y Docente at Leeway Academy
Hola! Soy Mauro Chojrin, estudié la Lic. en Ciencias de la Computación en la Universidad de Buenos Aires.

Me desempeño como docente de programación desde el año 1997.

Pasé por diferentes instituciones (Escuela Técnica ORT, Digital House, EducacionIT, ITMaster, Escuela DaVinci entre otros).

Actualmente coordino los cursos dictados en Leeway Academy y desarrollo sistemas usando PHP y framework Symfony

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.