Introducción a OAuth 2.0 y JWT en C++
En el desarrollo web moderno, la seguridad y la gestión de acceso son aspectos críticos. OAuth 2.0 y JWT (JSON Web Tokens) se han convertido en el estándar de facto para implementar autorización en API y aplicaciones web. A pesar de que estas tecnologías se asocian más a menudo con JavaScript, Python o Java, C++ también proporciona herramientas potentes para su implementación.
En este artículo, analizaremos cómo funcionan OAuth 2.0 y JWT, y mostraremos ejemplos prácticos de su implementación en C++. El material está orientado a desarrolladores principiantes familiarizados con los fundamentos de C++ y la programación en red.
¿Qué es OAuth 2.0?
OAuth 2.0 es un protocolo de autorización que permite a las aplicaciones obtener acceso limitado a los recursos del usuario sin transferir sus credenciales (nombre de usuario y contraseña). En su lugar, se utilizan tokens de acceso. Los roles principales en OAuth 2.0 son:
- Resource Owner (Propietario del recurso) — el usuario al que pertenecen los datos.
- Client (Cliente) — la aplicación que solicita acceso.
- Authorization Server (Servidor de autorización) — emite tokens tras una autenticación exitosa.
- Resource Server (Servidor de recursos) — la API protegida por tokens.
¿Qué es JWT?
JWT (JSON Web Token) es un formato de token compacto que contiene un objeto JSON con datos (claims) y está firmado para verificar su integridad. La estructura de JWT consta de tres partes separadas por puntos:
- Header (Encabezado) — contiene el tipo de token y el algoritmo de firma (por ejemplo, HS256 o RS256).
- Payload (Carga útil) — contiene los datos (por ejemplo, ID de usuario, fecha de expiración).
- Signature (Firma) — se crea mediante el hash del header + payload usando una clave secreta.
La ventaja de JWT es que es autónomo: el servidor de recursos puede verificar el token sin consultar al servidor de autorización, lo que acelera el funcionamiento.
Parte principal: Implementación en C++
1. Librerías y preparación del entorno
Para trabajar con OAuth 2.0 y JWT en C++ necesitaremos las siguientes librerías:
- cURL (libcurl) — para solicitudes HTTP al servidor de autorización.
- nlohmann/json — para trabajar con JSON.
- jwt-cpp — para crear y verificar tokens JWT.
- OpenSSL — para operaciones criptográficas (firma y hash).
Instalación mediante vcpkg (recomendado):
vcpkg install curl jsoncpp jwt-cpp opensslEjemplo de CMakeLists.txt:
cmake_minimum_required(VERSION 3.15)project(OAuthJWTExample)
find_package(CURL REQUIRED)find_package(nlohmann_json REQUIRED)find_package(jwt-cpp REQUIRED)find_package(OpenSSL REQUIRED)
add_executable(main main.cpp)target_link_libraries(main CURL::libcurl nlohmann_json::nlohmann_json jwt-cpp::jwt-cpp OpenSSL::SSL OpenSSL::Crypto)2. Implementación del flujo de código de autorización OAuth 2.0
Consideremos el flujo más común: el Authorization Code Flow. El cliente obtiene un código de autorización del usuario y luego lo intercambia por un token de acceso.
Paso 1: Redirección del usuario al servidor de autorización (ejemplo simplificado):
#include <iostream>#include <string>
std::string buildAuthUrl(const std::string& clientId, const std::string& redirectUri) { return "https://auth.example.com/authorize?" "response_type=code&" "client_id=" + clientId + "&" "redirect_uri=" + redirectUri + "&" "scope=openid+profile";}
int main() { std::string clientId = "your_client_id"; std::string redirectUri = "http://lo