Introducción a OAuth 2.0 y autorización JWT en C++
En el mundo moderno del desarrollo web, la seguridad y la facilidad de autenticación juegan un papel clave. OAuth 2.0 y JWT (JSON Web Tokens) se han convertido en estándares de facto para implementar autorización en sistemas distribuidos. En este artículo, veremos cómo implementar la autorización OAuth 2.0 y JWT en el lenguaje C++ — un lenguaje potente y de alto rendimiento que se utiliza a menudo para crear aplicaciones de servidor con alta carga.
A pesar de que C++ no es una elección típica para el desarrollo web, su rendimiento y control sobre la memoria lo hacen ideal para crear puertas de enlace API, microservicios y sistemas en tiempo real. Mostraremos cómo usar bibliotecas modernas de C++ para trabajar con HTTP, JSON y criptografía, para construir un sistema de autorización confiable.
Fundamentos de 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. Los roles principales en OAuth 2.0 son:
- Resource Owner — el usuario propietario de los recursos
- Client — la aplicación que solicita acceso
- Authorization Server — el servidor que emite tokens
- Resource Server — el servidor que proporciona recursos protegidos
Los flujos principales (grant types) de OAuth 2.0 son:
- Authorization Code — para aplicaciones de servidor
- Client Credentials — para autenticación servicio a servicio
- Implicit — obsoleto, para SPA
- Resource Owner Password Credentials — para clientes de confianza
Implementación de un cliente OAuth 2.0 en C++
Para trabajar con HTTP en C++ usaremos la biblioteca cpp-httplib. Veamos un ejemplo de obtención de un access token a través del flujo Client Credentials:
#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>
using json = nlohmann::json;
std::string get_access_token(const std::string& client_id, const std::string& client_secret, const std::string& token_url) { httplib::Client cli(token_url); // Formamos el cuerpo de la solicitud std::string body = "grant_type=client_credentials&" "client_id=" + client_id + "&" "client_secret=" + client_secret; auto res = cli.Post("/token", body, "application/x-www-form-urlencoded"); if (res && res->status == 200) { json response = json::parse(res->body); return response["access_token"]; } throw std::runtime_error("Failed to get access token");}JWT (JSON Web Tokens)
JWT es una forma compacta y autónoma de transmitir información entre partes en forma de objeto JSON. El token consta de tres partes:
- Header — contiene el tipo de token y el algoritmo de firma
- Payload — contiene los claims (afirmaciones) sobre el usuario
- Signature — firma para verificación
Generación de JWT en C++
Para trabajar con JWT y criptografía en C++ usamos las bibliotecas jwt-cpp y OpenSSL. Ejemplo de generación de JWT con el algoritmo HS256:
#include <jwt-cpp/jwt.h>#include <chrono>
std::string create_jwt(const std::string& user_id, const std::string& secret_key) { auto now = std::chrono::system_clock::now(); auto exp = now + std::chrono::hours(1); auto token = jwt::create() .set_type("JWT") .set_issuer("auth.example.com") .set_subject(user_id) .set_issued_at(now) .set_expires_at(exp) .set_payload_c