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:
- 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.
- 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 Composer: composer 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 callbackproviders
Lista de proveedores que quieras usar (¡Claro que deben estar soportados por la librería!).enabled
true
ofalse
keys
Credenciales de acceso para tu aplicación:id
Identificación de tu aplicaciónkey
Clave de accesosecret
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ícate con tu Facebook</legend> <a href="login.php">Autorizar</a> </fieldset> </form> </html>
¿Quedó alguna duda? ¡Espero tus comentarios!
- ¿Cómo instalar extensiones PHP en Docker? - 26/11/2024
- Cómo agregar una página de error 500 en un proyecto PHP - 31/10/2024
- ¿Cuántos contenedoresnecesita tu php? - 28/10/2024
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.
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?
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!
Suena bastante raro… ¿por qué pensás que «nunca llega a Facebook»? ¿Hiciste un seguimiento con un debugger?