Introduction à OAuth 2.0 et à l'autorisation JWT en C++
Dans le monde moderne du développement web, la sécurité et la commodité de l'authentification jouent un rôle clé. OAuth 2.0 et JWT (JSON Web Tokens) sont devenus les standards de facto pour implémenter l'autorisation dans les systèmes distribués. Dans cet article, nous verrons comment implémenter l'autorisation OAuth 2.0 et JWT en langage C++ — un langage puissant et performant, souvent utilisé pour créer des applications serveur à forte charge.
Bien que C++ ne soit pas un choix typique pour le développement web, ses performances et son contrôle de la mémoire le rendent idéal pour créer des passerelles API, des microservices et des systèmes en temps réel. Nous montrerons comment utiliser les bibliothèques C++ modernes pour travailler avec HTTP, JSON et la cryptographie, afin de construire un système d'autorisation fiable.
Fondamentaux d'OAuth 2.0
OAuth 2.0 est un protocole d'autorisation qui permet aux applications d'obtenir un accès limité aux ressources d'un utilisateur sans transmettre ses identifiants. Les rôles principaux dans OAuth 2.0 sont :
- Resource Owner — l'utilisateur propriétaire des ressources
- Client — l'application demandant l'accès
- Authorization Server — le serveur délivrant les tokens
- Resource Server — le serveur fournissant les ressources protégées
Les principaux flux (grant types) d'OAuth 2.0 sont :
- Authorization Code — pour les applications serveur
- Client Credentials — pour l'authentification service-à-service
- Implicit — obsolète, pour les SPA
- Resource Owner Password Credentials — pour les clients de confiance
Implémentation d'un client OAuth 2.0 en C++
Pour travailler avec HTTP en C++, nous utiliserons la bibliothèque cpp-httplib. Voici un exemple d'obtention d'un access token via le flux Client Credentials :
#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>
using json = nlohmann::json;
std::string get_access_token(const std::string& client_id, const std::string& client_secret, const std::string& token_url) { httplib::Client cli(token_url); // Forme le corps de la requête std::string body = "grant_type=client_credentials&" "client_id=" + client_id + "&" "client_secret=" + client_secret; auto res = cli.Post("/token", body, "application/x-www-form-urlencoded"); if (res && res->status == 200) { json response = json::parse(res->body); return response["access_token"]; } throw std::runtime_error("Failed to get access token");}JWT (JSON Web Tokens)
JWT est un moyen compact et autonome de transmettre des informations entre les parties sous la forme d'un objet JSON. Le token se compose de trois parties :
- Header — contient le type de token et l'algorithme de signature
- Payload — contient les claims (affirmations) concernant l'utilisateur
- Signature — signature pour la vérification
Génération de JWT en C++
Pour travailler avec JWT et la cryptographie en C++, nous utilisons les bibliothèques jwt-cpp et OpenSSL. Exemple de génération d'un JWT avec l'algorithme HS256 :
#include <jwt-cpp/jwt.h>#include <chrono>
std::string create_jwt(const std::string& user_id, const std::string& secret_key) { auto now = std::chrono::system_clock::now(); auto exp = now + std::chrono::hours(1); auto token = jwt::create() .set_type("JWT") .set_issuer("auth.example.com") .set_subject(user_id) .set_issued_at(now) .set_expires_at(exp) .set_payload_c