Une bibliothèque d'en-tête uniquement pour créer et valider des jetons Web JSON en C++11. Pour une excellente introduction, lisez ceci.
L'objectif est de fournir une collection polyvalente et universellement applicable d'algorithmes, de classes et de structures de données, favorisant l'adaptabilité et l'intégration transparente avec d'autres bibliothèques que vous utilisez peut-être déjà.
jwt-cpp prend entièrement en charge tous les algorithmes spécifiés dans la norme. Sa conception modulaire facilite l'inclusion transparente d'algorithmes supplémentaires sans rencontrer de complications. Si vous souhaitez contribuer à de nouveaux algorithmes, n'hésitez pas à lancer une pull request ou à ouvrir un ticket.
Pour être complet, voici une liste de tous les algorithmes pris en charge :
HMSC | RSA | ECDSA | PSS | EdDSA |
---|---|---|---|---|
HS256 | RS256 | ES256 | PS256 | Ed25519 |
HS384 | RS384 | ES384 | PS384 | Ed448 |
HS512 | RS512 | ES512 | PS512 | |
ES256K |
Les instructions d'installation peuvent être trouvées ici.
Un exemple simple consiste à décoder un jeton et à imprimer toutes ses revendications. Essayons-le :
# 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;
}
Vous pouvez créer et exécuter cet exemple localement après avoir cloné le référentiel. En exécutant certaines commandes, nous pouvons voir le contenu de la charge utile JWT
cmake .
cmake --build . --target print-claims
./print-claims
# iss = "auth0"
# sample = "test"
Vous remarquerez très rapidement que les JWT ne sont pas cryptés mais plutôt signés cryptographiquement pour assurer la non-répudiation.
Afin de vérifier un jeton, vous devez d'abord créer un vérificateur et l'utiliser pour vérifier un jeton décodé.
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);
Le vérificateur est apatride, vous pouvez donc le réutiliser pour différents jetons.
Créer le jeton ci-dessus (et le signer) est tout aussi simple.
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 vous souhaitez émettre ou vérifier des jetons plus uniques, consultez les exemples d'utilisation des clés publiques et privées RSA, des jetons à courbe elliptique et bien plus encore !
S’appuyer sur l’objectif d’offrir de la flexibilité.
jwt-cpp prend en charge OpenSSL, LibreSSL et wolfSSL. Pour une liste des versions testées, consultez cette page pour plus de détails.
Il n'y a pas de dépendance stricte à l'égard d'une bibliothèque JSON spécifique dans ce contexte. Au lieu de cela, le jwt-cpp utilise un jwt::basic_claim
générique qui est modélisé en fonction du trait de type. Ce trait fournit les types sémantiques JSON pour les valeurs, les objets, les tableaux, les chaînes, les nombres, les entiers et les booléens, ainsi que des méthodes pour traduire de manière transparente entre eux.
Cette conception offre une flexibilité dans le choix de la bibliothèque JSON qui correspond le mieux à vos besoins. Pour exploiter l'un des traits JSON fournis, reportez-vous à docs/traits.md pour obtenir des conseils détaillés.
jwt::basic_claim<my_favorite_json_library_traits> claim (json::object({{ " json " , true },{ " example " , 0 }}));
Pour savoir comment écrire l'implémentation d'un trait, consultez ces instructions
En ce qui concerne les spécifications base64 pour les JWT, cette bibliothèque inclut base.h
englobant toutes les variantes nécessaires. Bien que la bibliothèque elle-même offre une implémentation base64 compétente, il convient de noter que les implémentations base64 sont largement disponibles, présentant divers niveaux de performances. Si vous préférez utiliser votre propre implémentation base64, vous avez la possibilité de définir JWT_DISABLE_BASE64
pour exclure l'implémentation jwt-cpp.
Si vous avez des suggestions d'amélioration ou si vous avez identifié un bug, n'hésitez pas à ouvrir un ticket ou à contribuer en créant une pull request. Lorsque vous signalez un bogue, fournissez des détails complets sur votre environnement, y compris la version du compilateur et d'autres informations pertinentes, pour faciliter la reproduction du problème. De plus, si vous introduisez une nouvelle fonctionnalité, assurez-vous d'inclure les cas de test correspondants pour valider sa fonctionnalité.
Pour utiliser jwt-cpp, vous avez besoin des outils suivants.
Afin de créer les cas de test, vous avez également besoin
Consultez la FAQ pour obtenir des conseils.