Tokens JWT en C++: biblioteca jwt-cpp
\n\nJSON 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\nEn 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\nInstalación de jwt-cpp
\n\nLa 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\ngit clone https://github.com/Thalhammer/jwt-cpp.git\n\nLuego, agregue la ruta a la carpeta include en la configuración de su compilador. Si usa CMake, la vinculación se verá así:
add_subdirectory(jwt-cpp)\ntarget_link_libraries(your_project jwt-cpp)\n\nLa biblioteca depende de OpenSSL y jsoncpp (o nlohmann/json), así que asegúrese de que estén instalados.
Creación básica de un token JWT
\n\nEl 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\nEl resultado será una cadena que consta de tres partes (header, payload, signature) separadas por puntos.
\n\nVerificación del token
\n\nPara 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\nImportante: si el token ha expirado (exp), ha sido modificado o está firmado con otra clave, se lanzará una excepción.
\n\nTrabajo con RSA (cifrado asimétrico)
\n\nPara 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" También en la biblioteca
Geolocalización y mapas en C++: revisión de bibliotecas y herramientas
Event Bus y el patrón Observer en Java: guía con ejemplos
Procesamiento de Markdown en Node.js: bibliotecas marked, showdown y remarkable
Trabajo con imágenes en Go (Golang): bibliotecas y ejemplos