Tokens JWT en C++: implementación y verificación con jwt-cpp

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

\n\n

JSON Web Token (JWT) es una forma compacta y autónoma de transmitir información entre partes en forma de objeto JSON. En C++, existen varias bibliotecas para trabajar con JWT, pero una de las más populares y convenientes es jwt-cpp. Proporciona una API simple para crear, firmar y verificar tokens JWT utilizando varios algoritmos (HMAC, RSA, ECDSA).

\n\n

En este artículo, exploraremos las principales características de la biblioteca jwt-cpp, aprenderemos a crear y verificar tokens, y analizaremos ejemplos de código para tareas típicas.

\n\n

Instalación de jwt-cpp

\n\n

La biblioteca jwt-cpp es header-only (solo de encabezados), lo que facilita su integración en un proyecto. Para instalarla, simplemente clone el repositorio:

\n\n
git clone https://github.com/Thalhammer/jwt-cpp.git
\n\n

Luego, agregue la ruta a la carpeta include en la configuración de su compilador. Si usa CMake, la vinculación se verá así:

\n\n
add_subdirectory(jwt-cpp)\ntarget_link_libraries(your_project jwt-cpp)
\n\n

La biblioteca depende de OpenSSL y jsoncpp (o nlohmann/json), así que asegúrese de que estén instalados.

\n\n

Creación básica de un token JWT

\n\n

El ejemplo más simple es crear un token usando el algoritmo HMAC-SHA256. Puede agregar campos estándar (iss, sub, exp, iat) y claims personalizados al token.

\n\n
#include <jwt-cpp/jwt.h>\n#include <iostream>\n\nint main() {\n    // Crear el token\n    auto token = jwt::create()\n        .set_issuer("auth0")\n        .set_subject("1234567890")\n        .set_issued_at(std::chrono::system_clock::now())\n        .set_expires_at(std::chrono::system_clock::now() + std::chrono::hours{1})\n        .set_payload_claim("name", jwt::claim(std::string("John Doe")))\n        .sign(jwt::algorithm::hs256{"secret-key"});\n\n    std::cout << "Token: " << token << std::endl;\n    return 0;\n}
\n\n

El resultado será una cadena que consta de tres partes (header, payload, signature) separadas por puntos.

\n\n

Verificación del token

\n\n

Para verificar la autenticidad del token, debe usar la misma clave secreta (o clave pública para RSA). Ejemplo de verificación:

\n\n
#include <jwt-cpp/jwt.h>\n#include <iostream>\n\nint main() {\n    std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // su token\n\n    try {\n        auto decoded = jwt::decode(token);\n        \n        // Verificar la firma\n        auto verifier = jwt::verify()\n            .allow_algorithm(jwt::algorithm::hs256{"secret-key"})\n            .with_issuer("auth0");\n\n        verifier.verify(decoded);\n\n        // Extraer datos\n        std::cout << "¡Token válido!" << std::endl;\n        std::cout << "Subject: " << decoded.get_subject() << std::endl;\n        std::cout << "Name: " << decoded.get_payload_claim("name").as_string() << std::endl;\n    } catch (const std::exception& e) {\n        std::cerr << "Error de verificación: " << e.what() << std::endl;\n    }\n\n    return 0;\n}
\n\n

Importante: si el token ha expirado (exp), ha sido modificado o está firmado con otra clave, se lanzará una excepción.

\n\n

Trabajo con RSA (cifrado asimétrico)

\n\n

Para sistemas más seguros, a menudo se usa RSA. En este caso, el token se firma con una clave privada y se verifica con una clave pública.

\n\n
#include <jwt-cpp/jwt.h>\n#include <fstream>\n#include <sstream>\n\nint main() {\n    // Leer la clave privada desde un archivo\n    std::ifstream priv_file("private.pem");\n    std::stringstream priv_ss;\n    priv_ss << priv_file.rdbuf();\n    std::string private_key = priv_ss.str();\n\n    // Crear token con RSA\n    auto token = jwt::create()\n        .set_issuer("myapp")\n        .set_subject("user123"                    

Recommendations