Tokens JWT en C++: biblioteca jwt-cpp para autenticación

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

Tokens JWT en C++: biblioteca jwt-cpp



JSON Web Token (JWT) es un estándar abierto (RFC 7519) para crear tokens de acceso basados en JSON. En C++, la biblioteca jwt-cpp (autor Thalhammer) se utiliza ampliamente para trabajar con JWT. Proporciona una API conveniente para crear, verificar y decodificar tokens JWT con soporte para varios algoritmos de firma (HS256, RS256, etc.).



La biblioteca está escrita en C++17 moderno, no requiere dependencias externas (excepto OpenSSL para algoritmos asimétricos) y cuenta con el apoyo activo de la comunidad.



Instalación de jwt-cpp



La forma más sencilla de instalación es a través del gestor de paquetes vcpkg o Conan:



// A través de vcpkgvcpkg install jwt-cpp

// A través de Conanconan install jwt-cpp/0.7.0@

// O copiar el archivo de cabecera al proyectogit clone https://github.com/Thalhammer/jwt-cpp.git


Para compilar con CMake, basta con indicar:



find_package(jwt-cpp REQUIRED)target_link_libraries(myapp jwt-cpp::jwt-cpp)


Funcionalidades principales



  • Creación de tokens con claims arbitrarios (sub, iss, exp, personalizados).
  • Verificación de firma y comprobación de tiempo de vida (exp, nbf).
  • Decodificación del payload sin verificación (para depuración).
  • Soporte de algoritmos: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512.
  • Validadores personalizados — se puede agregar comprobación de cualquier campo.


Ejemplo 1: Creación de un token JWT (HS256)



#include <jwt-cpp/jwt.h>#include <iostream>

int main() { // Creamos un token con algoritmo HS256 auto token = jwt::create() .set_type("JWT") .set_issuer("auth.pythonlib.ru") .set_subject("user123") .set_expires_at(std::chrono::system_clock::now() + std::chrono::hours{1}) .set_payload_claim("role", jwt::claim(std::string("admin"))) .sign(jwt::algorithm::hs256{"secret_key_12345"});

std::cout << "Token creado:" << token << std::endl; return 0;}


En este ejemplo, creamos un token con:

  • tipo JWT,
  • emisor auth.pythonlib.ru,
  • sujeto user123,
  • tiempo de validez de 1 hora,
  • campo personalizado role con valor admin.


Ejemplo 2: Verificación y decodificación



#include <jwt-cpp/jwt.h>#include <iostream>

int main() { std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // Su token

try { // Decodificamos sin verificar la firma (solo para leer el payload) auto decoded = jwt::decode(token); std::cout << "Emisor: " << decoded.get_issuer() << std::endl; std::cout << "Sujeto: " << decoded.get_subject() << std::endl;

// Verificamos la firma y el tiempo de vida auto verifier = jwt::verify() .allow_algorithm(jwt::algorithm::hs256{"secret_key_12345"}) .with_issuer("auth.pythonlib.ru");

verifier.verify(decoded); std::cout << "¡Token válido!" << std::endl;

} catch (const jwt::TokenExpiredError& e) { std::cerr << "Error: token expirado" << std::endl; } catch (const jwt::InvalidAlgorithmError& e) { std::cerr << "Error: algoritmo no válido" << std::endl; } catch (const std::exception& e) { std::cerr << "Error de verificación: " << e.what() << std::endl; }

return 0;}


Ejemplo 3: Trabajo con claves asimétricas (RS256)



#include <jwt-cpp/jwt.h>#include <fstream>#include <sstream>

std::string read_file(const std::string& path) {

Recommendations