Jetons JWT en C++ : implémentation et vérification avec jwt-cpp

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Jetons JWT en C++ : bibliothèque jwt-cpp

\n\n

JSON Web Token (JWT) est un moyen compact et autonome de transmettre des informations entre les parties sous la forme d'un objet JSON. En C++, il existe plusieurs bibliothèques pour travailler avec JWT, mais l'une des plus populaires et des plus pratiques est jwt-cpp. Elle fournit une API simple pour créer, signer et vérifier des jetons JWT en utilisant différents algorithmes (HMAC, RSA, ECDSA).

\n\n

Dans cet article, nous explorerons les principales fonctionnalités de la bibliothèque jwt-cpp, apprendrons à créer et vérifier des jetons, et analyserons des exemples de code pour des tâches typiques.

\n\n

Installation de jwt-cpp

\n\n

La bibliothèque jwt-cpp est header-only (uniquement composée d'en-têtes), ce qui simplifie son intégration dans un projet. Pour l'installer, il suffit de cloner le dépôt :

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

Ensuite, ajoutez le chemin vers le dossier include dans les paramètres de votre compilateur. Si vous utilisez CMake, l'inclusion ressemblera à ceci :

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

La bibliothèque dépend de OpenSSL et de jsoncpp (ou nlohmann/json), alors assurez-vous qu'ils sont installés.

\n\n

Création de base d'un jeton JWT

\n\n

L'exemple le plus simple est la création d'un jeton en utilisant l'algorithme HMAC-SHA256. Vous pouvez ajouter des champs standard (iss, sub, exp, iat) et des claims personnalisés au jeton.

\n\n
#include <jwt-cpp/jwt.h>\n#include <iostream>\n\nint main() {\n    // Création du jeton\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 << "Jeton : " << token << std::endl;\n    return 0;\n}
\n\n

Le résultat sera une chaîne composée de trois parties (header, payload, signature), séparées par des points.

\n\n

Vérification du jeton

\n\n

Pour vérifier l'authenticité du jeton, vous devez utiliser la même clé secrète (ou la clé publique pour RSA). Exemple de vérification :

\n\n
#include <jwt-cpp/jwt.h>\n#include <iostream>\n\nint main() {\n    std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // votre jeton\n\n    try {\n        auto decoded = jwt::decode(token);\n        \n        // Vérification de la signature\n        auto verifier = jwt::verify()\n            .allow_algorithm(jwt::algorithm::hs256{"secret-key"})\n            .with_issuer("auth0");\n\n        verifier.verify(decoded);\n\n        // Extraction des données\n        std::cout << "Jeton valide !" << std::endl;\n        std::cout << "Subject : " << decoded.get_subject() << std::endl;\n        std::cout << "Nom : " << decoded.get_payload_claim("name").as_string() << std::endl;\n    } catch (const std::exception& e) {\n        std::cerr << "Erreur de vérification : " << e.what() << std::endl;\n    }\n\n    return 0;\n}
\n\n

Important : si le jeton est expiré (exp), modifié ou signé avec une autre clé, une exception sera levée.

\n\n

Utilisation de RSA (chiffrement asymétrique)

\n\n

Pour des systèmes plus sécurisés, on utilise souvent RSA. Dans ce cas, le jeton est signé avec une clé privée et vérifié avec une clé publique.

\n\n
#include <jwt-cpp/jwt.h>\n#include <fstream>\n#include <sstream>\n\nint main() {\n    // Lecture de la clé privée depuis un fichier\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    // Création du jeton avec RSA\n    auto token = jwt::create()\n        .set_issuer("myapp")\n        .set_subject("user123"                    

Recommendations