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 circuito 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 ésta se solicitó.

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

Por mchojrin

Ayudo a desarrolladores PHP a afinar sus habilidades técnicas y avanzar en sus carreras

4 comentarios

  1. Hola! Excelente tutorial! Me sirvió muchisimo!
    Te hago una consulta, tuve un problema con el login de Facebook nomás, por alguna razón cuando le doy al botón de loguearse con facebook, me redirecciona a:

    http://localhost/vendor/hybridauth/hybridauth/hybridauth/?hauth.start=Facebook&hauth.time=1621546562

    cuando debería redireccionarme a:

    http://localhost[/web_project%5D/vendor/hybridauth/hybridauth/hybridauth/?hauth.start=Facebook&hauth.time=1621546562
    (lo mismo sumado a lo que está entre [ ] )

    Lo cual me resulta raro ya que la base_url sí contiene el nombre del proyecto y todo. Es más. utilizo exactamente el mismo código para el login de google (con las modificaciones del servicio al que apunto) y me funciona excelente.

    Si me pudieras orientar me serviría muchisimo!

    Muchas gracias nuevamente.

    1. Hola!

      Gracias! Me alegra que te haya gustado 🙂

      No recuerdo ese detalle específico… habría que buscar en la documentación de Facebook si no requiere sí o sí que la base_url sea un dominio puro… igual me da un poco de curiosidad, el directorio literalmente tiene un «[]»? ¿No se puede usar una URL común?

      1. Me resulta raro porque aparentemente nunca llega a ir siquiera a facebook, parece directamente un error de redireccionamiento desde mi localhost con Hybrid_Auth. Por eso me resulta raro también que con Google esté funcionando perfecto.

        Con respecto al directorio, no. los [] eran unicamente para idicarte en el comentario donde estaba el nombre del project.

        Gracias por tu respuesta!

¿Te quedó alguna duda? Publica aca tu pregunta

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