OAuth 2.0 y autorización JWT en PHP: guía completa para principiantes

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

Introducción a OAuth 2.0 y JWT en PHP

\n\n

Las aplicaciones web modernas rara vez prescinden de sistemas de autorización. Los dos protocolos más populares — OAuth 2.0 y JWT (JSON Web Token) — permiten a los desarrolladores crear soluciones seguras y escalables. En este artículo, analizaremos cómo implementar la autorización OAuth 2.0 y JWT en PHP desde cero. El material está orientado a principiantes, por lo que todos los conceptos se explicarán en un lenguaje sencillo con ejemplos prácticos.

\n\n

OAuth 2.0 es un protocolo de acceso delegado. Permite a los usuarios otorgar a terceros acceso limitado a sus recursos sin compartir su contraseña. JWT, por su parte, es un formato de token compacto que contiene toda la información necesaria sobre el usuario y sus permisos.

\n\n

¿Qué es JWT y cómo funciona?

\n\n

JWT (JSON Web Token) es un estándar abierto (RFC 7519) que define una forma compacta y autónoma de transmitir información entre partes como un objeto JSON. El token consta de tres partes separadas por puntos:

\n\n
    \n
  • Header — contiene información sobre el tipo de token y el algoritmo de cifrado (generalmente HS256 o RS256).
  • \n
  • Payload — contiene las "declaraciones" (claims): datos del usuario, hora de emisión (iat), hora de expiración (exp) y otros.
  • \n
  • Signature — firma creada a partir del header, payload y una clave secreta. Garantiza la integridad de los datos.
  • \n
\n\n

Así es como se ve un JWT típico:

\n\n
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ItCQ0L3QsNGC0L7Qu9C40LkiLCJpYXQiOjE1MTYyMzkwMjJ9.4vGJ7qF6b0Q9l8z3X5p2Rk1h7t9y2w4z6x8c0v2b4n6m8
\n\n

La ventaja de JWT es que el servidor no necesita almacenar sesiones en la base de datos — toda la información ya está codificada en el token. Esto hace que el sistema sea fácilmente escalable.

\n\n

Instalación de la biblioteca para trabajar con JWT en PHP

\n\n

Para trabajar con JWT en PHP, usaremos la popular biblioteca firebase/php-jwt. Instálela a través de Composer:

\n\n
composer require firebase/php-jwt
\n\n

Creación y verificación de un token JWT

\n\n

Veamos un ejemplo básico de creación de un token al iniciar sesión y su verificación al solicitar un recurso protegido.

\n\n

1. Generación del token (login.php):

\n\n
<?php\nrequire_once 'vendor/autoload.php';\n\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$secretKey = 'su-clave-secreta-de-al-menos-32-caracteres';\n\n// Datos del usuario después de una autenticación exitosa\n$payload = [\n    'iss' => 'pythonlib.ru',        // Emisor del token\n    'sub' => $userId,              // ID del usuario\n    'name' => $userName,           // Nombre del usuario\n    'role' => 'user',              // Rol\n    'iat' => time(),               // Hora de emisión\n    'exp' => time() + 3600         // El token expira en 1 hora\n];\n\n$jwt = JWT::encode($payload, $secretKey, 'HS256');\n\n// Enviamos el token al cliente\necho json_encode(['token' => $jwt]);\n?>
\n\n

2. Verificación del token (profile.php):

\n\n
<?php\nrequire_once 'vendor/autoload.php';\n\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$secretKey = 'su-clave-secreta-de-al-menos-32-caracteres';\n\n// Obtenemos el token del encabezado Authorization\n$headers = getallheaders();\n$authHeader = $headers['Authorization'] ?? '';\n\nif (preg_match('/Bearer\\s(\\S+)/', $authHeader, $matches)) {\n    $jwt = $matches[1];\n    \n    try {\n        $decoded = JWT::decode($jwt, new Key($secretKey, 'HS256'));\n        \n        // El token es válido, obtenemos los datos del usuario\n        $userId = $decoded->sub;\n        $userName = $decoded->name;\n        \n        // Devolvemos los datos protegidos\n        echo json_encode(['status' => 'success', 'user' => $decoded]);\n        \n    } catch (Exception $e) {\n        // El token no es válido o ha expirado\n        htt                

Blogs

Book Recommendations