Una biblioteca de solo encabezado para crear y validar tokens web JSON en C++11. Para una gran introducción, lea esto.
El objetivo es ofrecer una colección de algoritmos, clases y estructuras de datos versátil y de aplicación universal, fomentando la adaptabilidad y la integración perfecta con otras bibliotecas que quizás ya esté empleando.
jwt-cpp admite de manera integral todos los algoritmos especificados en el estándar. Su diseño modular facilita la inclusión perfecta de algoritmos adicionales sin encontrar complicaciones. Si desea contribuir con nuevos algoritmos, no dude en iniciar una solicitud de extracción o abrir un problema.
Para completar, aquí hay una lista de todos los algoritmos admitidos:
HMSC | RSA | ECDSA | PSS | EdDSA |
---|---|---|---|---|
HS256 | RS256 | ES256 | PS256 | Ed25519 |
HS384 | RS384 | ES384 | PS384 | Ed448 |
HS512 | RS512 | ES512 | PS512 | |
ES256K |
Las instrucciones de instalación se pueden encontrar aquí.
Un ejemplo simple es decodificar un token e imprimir todas sus afirmaciones. Vamos a (probarlo):
# include < jwt-cpp/jwt.h >
# include < iostream >
int main () {
std::string token = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCIsInNhbXBsZSI6InRlc3QifQ.lQm3N2bVlqt2-1L-FsOjtR6uE-L4E9zJutMWKIe1v1M " ;
auto decoded = jwt::decode (token);
for ( auto & e : decoded. get_payload_json ())
std::cout << e. first << " = " << e. second << std::endl;
}
Puede compilar y ejecutar este ejemplo localmente después de clonar el repositorio. Al ejecutar algunos comandos, podemos ver el contenido de la carga útil JWT.
cmake .
cmake --build . --target print-claims
./print-claims
# iss = "auth0"
# sample = "test"
Rápidamente notará que los JWT no están cifrados, sino firmados criptográficamente para brindar no repudio.
Para verificar un token, primero crea un verificador y lo utiliza para verificar un token decodificado.
auto verifier = jwt::verify()
.with_issuer( " auth0 " )
.with_claim( " sample " , jwt::claim(std::string( " test " )))
.allow_algorithm(jwt::algorithm::hs256{ " secret " });
verifier.verify(decoded_token);
El verificador no tiene estado, por lo que puedes reutilizarlo para diferentes tokens.
Crear el token anterior (y firmarlo) es igual de fácil.
auto token = jwt::create()
.set_type( " JWS " )
.set_issuer( " auth0 " )
.set_payload_claim( " sample " , jwt::claim(std::string( " test " )))
.sign(jwt::algorithm::hs256{ " secret " });
Si desea emitir o verificar tokens más exclusivos, consulte los ejemplos que funcionan con claves públicas y privadas RSA, tokens de curva elíptica y mucho más.
Aprovechando el objetivo de proporcionar flexibilidad.
jwt-cpp admite OpenSSL, LibreSSL y wolfSSL. Para obtener una lista de las versiones probadas, consulte esta página para obtener más detalles.
En este contexto, no existe una dependencia estricta de una biblioteca JSON específica. En su lugar, jwt-cpp utiliza un jwt::basic_claim
genérico que tiene una plantilla basada en el tipo de rasgo. Este rasgo proporciona los tipos JSON semánticos para valores, objetos, matrices, cadenas, números, enteros y booleanos, junto con métodos para traducirlos sin problemas.
Este diseño ofrece flexibilidad para elegir la biblioteca JSON que mejor se adapte a sus necesidades. Para aprovechar uno de los rasgos JSON proporcionados, consulte docs/traits.md para obtener orientación detallada.
jwt::basic_claim<my_favorite_json_library_traits> claim (json::object({{ " json " , true },{ " example " , 0 }}));
Para aprender cómo escribir la implementación de un rasgo, consulte estas instrucciones
Con respecto a las especificaciones base64 para JWT, esta biblioteca incluye base.h
que abarca todas las variantes necesarias. Si bien la biblioteca en sí ofrece una implementación base64 competente, vale la pena señalar que las implementaciones base64 están ampliamente disponibles y exhiben diversos niveles de rendimiento. Si prefiere utilizar su propia implementación base64, tiene la opción de definir JWT_DISABLE_BASE64
para excluir la implementación jwt-cpp.
Si tiene sugerencias para mejorar o si ha identificado un error, no dude en abrir un problema o contribuir creando una solicitud de extracción. Al informar un error, proporcione detalles completos sobre su entorno, incluida la versión del compilador y otra información relevante, para facilitar la reproducción del problema. Además, si está introduciendo una nueva característica, asegúrese de incluir los casos de prueba correspondientes para validar su funcionalidad.
Para utilizar jwt-cpp necesita las siguientes herramientas.
Para construir los casos de prueba también necesita
Consulte las preguntas frecuentes para obtener sugerencias.