Cliente OAuth para PHP: autenticación a través de redes sociales y API

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cliente OAuth para PHP: guía completa de integración de autenticación

\n\n

OAuth (Open Authorization) es un protocolo de autorización abierto que permite otorgar a un tercero acceso limitado a los recursos del usuario sin compartir nombre de usuario y contraseña. En el mundo de PHP existen varias librerías para implementar OAuth 2.0, pero una de las más populares y mantenidas es League\\OAuth2-Client (The PHP League). Esta librería proporciona una forma flexible y segura de integrar el inicio de sesión a través de Google, Facebook, GitHub, VK (VKontakte), Yandex y muchos otros servicios.

\n\n

En este artículo, analizaremos en detalle la instalación, configuración y uso del cliente OAuth para PHP con el ejemplo de autenticación a través de Google y VK. Aprenderá cómo obtener el access token, refresh token y los datos del perfil del usuario.

\n\n

Instalación del cliente OAuth mediante Composer

\n\n

Para comenzar, es necesario instalar la librería principal y los proveedores (adaptadores para servicios específicos). Ejecute en la terminal:

\n\n
composer require league/oauth2-client\ncomposer require league/oauth2-google\ncomposer require league/oauth2-vk
\n\n

La librería es compatible con PSR-7 (mensajes HTTP) y PSR-18 (cliente HTTP), por lo que también se recomienda instalar Guzzle o cualquier otro cliente HTTP compatible:

\n\n
composer require guzzlehttp/guzzle
\n\n

Arquitectura básica de OAuth 2.0

\n\n

OAuth 2.0 en PHP funciona según el siguiente esquema:

\n
    \n
  • Client ID y Client Secret — se obtienen al registrar la aplicación en el servicio (Google Cloud Console, VK Developers, etc.).
  • \n
  • Redirect URI — la URL en su sitio web a la que el servicio redirigirá al usuario después de la autorización.
  • \n
  • Authorization Code — un código temporal que se intercambia por un access token.
  • \n
  • Access Token — la clave para acceder a la API del usuario.
  • \n
  • Refresh Token — permite renovar el access token sin necesidad de una nueva autorización.
  • \n
\n\n

Ejemplo: inicio de sesión con Google

\n\n

Crearemos un manejador simple para la autenticación a través de Google. Se asume que ya tiene client_id y client_secret.

\n\n

Paso 1. Redirigir al usuario a la página de autorización de Google

\n\n
<?php\nrequire 'vendor/autoload.php';\n\n$provider = new \\League\\OAuth2\\Client\\Provider\\Google([\n    'clientId'     => 'SU_CLIENT_ID',\n    'clientSecret' => 'SU_CLIENT_SECRET',\n    'redirectUri'  => 'https://su-sitio.com/callback.php',\n]);\n\n// Generamos la URL para la autorización\n$authUrl = $provider->getAuthorizationUrl([\n    'scope' => ['email', 'profile'], // permisos solicitados\n]);\n\n// Guardamos el state en la sesión para protección contra CSRF\n$_SESSION['oauth2state'] = $provider->getState();\n\nheader('Location: ' . $authUrl);\nexit;
\n\n

Paso 2. Procesar el callback (callback.php)

\n\n
<?php\nsession_start();\nrequire 'vendor/autoload.php';\n\n$provider = new \\League\\OAuth2\\Client\\Provider\\Google([\n    'clientId'     => 'SU_CLIENT_ID',\n    'clientSecret' => 'SU_CLIENT_SECRET',\n    'redirectUri'  => 'https://su-sitio.com/callback.php',\n]);\n\n// Verificamos el state para prevenir ataques CSRF\nif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {\n    unset($_SESSION['oauth2state']);\n    exit('Estado inválido');\n}\n\ntry {\n    // Intercambiamos el authorization code por un access token\n    $accessToken = $provider->getAccessToken('authorization_code', [\n        'code' => $_GET['code']\n    ]);\n\n    // Obtenemos los datos del perfil del usuario\n    $resourceOwner = $provider->getResourceOwner($accessToken);\n    $user = $resourceOwner->toArray();\n\n    echo "¡Hola, " . htmlspecialchars($user['name']) . "!";\n    echo "Email: " . htmlspecialchars($user['email']);\n    // Guardamos el token en la base de datos para                    

Recommendations