Introduction à l'authentification et à l'autorisation en C++
L'authentification (vérification de l'identité de l'utilisateur) et l'autorisation (vérification des droits d'accès) sont des composants clés de la sécurité de toute application moderne. En C++, ces tâches sont résolues à l'aide de bibliothèques spécialisées qui permettent de prendre en charge les jetons JWT, OAuth 2.0, le hachage de mots de passe et la gestion des sessions. Dans cet article, nous analyserons les principaux outils, leur installation et des exemples d'utilisation.
Bibliothèques principales pour l'authentification en C++
1. JWT-CPP — Travailler avec les JSON Web Tokens
JWT-CPP est une bibliothèque légère pour la création et la vérification de jetons JWT. Elle prend en charge les algorithmes HMAC, RSA et ECDSA. Idéale pour les API REST et les microservices.
Installation :
git clone https://github.com/Thalhammer/jwt-cppcd jwt-cppmkdir build && cd buildcmake ..make && make installExemple de création et de vérification d'un jeton :
#include <jwt-cpp/jwt.h>#include <iostream>
int main() { // Création d'un jeton avec payload auto token = jwt::create() .set_issuer("auth.example.com") .set_type("JWS") .set_payload_claim("user_id", jwt::claim(std::string("12345"))) .sign(jwt::algorithm::hs256{"secret_key"});
std::cout << "Token: " << token << std::endl;
// Vérification du jeton auto decoded = jwt::decode(token); auto verifier = jwt::verify() .allow_algorithm(jwt::algorithm::hs256{"secret_key"}) .with_issuer("auth.example.com");
try { verifier.verify(decoded); std::cout << "Token valide. ID utilisateur : " << decoded.get_payload_claim("user_id").as_string() << std::endl; } catch (const std::exception& e) { std::cerr << "Jeton invalide : " << e.what() << std::endl; } return 0;}2. bcrypt-cpp — Hachage de mots de passe
La bibliothèque bcrypt-cpp fournit un hachage sécurisé des mots de passe en utilisant l'algorithme Blowfish. Elle inclut la génération automatique de sel et une protection contre les attaques par force brute.
Exemple d'utilisation :
#include <bcrypt/BCrypt.hpp>#include <iostream>
int main() { std::string password = "SuperSecret123!";
// Hachage du mot de passe std::string hash = BCrypt::generateHash(password); std::cout << "Hash : " << hash << std::endl;
// Vérification du mot de passe if (BCrypt::validatePassword(password, hash)) { std::cout << "Mot de passe correct !" << std::endl; } else { std::cout << "Mot de passe invalide." << std::endl; } return 0;}3. Client OAuth2 — Intégration avec les fournisseurs
Pour implémenter la connexion via Google, GitHub ou Facebook, utilisez la bibliothèque cpp-httplib en combinaison avec un traitement manuel des flux OAuth2. Exemple d'obtention d'un jeton d'accès via des requêtes HTTP :
#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>
int main() { httplib::Client cli("https://oauth2.googleapis.com");
// Paramètres de la requête (remplacez par les vôtres) auto res = cli.Post("/token", { {"code", "authorization_code"}, {"client_id", "YOUR_CLIENT_ID"}, {"client_secret", "YOUR_CLIENT_SECRET"}, {"redirect_uri", "http://localhost:8080/callback"}, {"grant_type", "authorization_code"} });
if (res && res->status == 200) { auto json = nlohmann::json::parse(res->body); std::cout << "Jeton d'accès : " << json["access_token"].get<std::string>() << std::endl; } else { std::cerr << "Échec de l'obtention du jeton" << std::endl; } return 0;}