OAuth 2.0 et autorisation JWT en C++ : en pratique
\n\nLes applications web modernes et les microservices fonctionnent rarement sans systèmes d'autorisation. Les deux standards les plus populaires — OAuth 2.0 pour la délégation d'accès et JWT (JSON Web Token) pour la transmission compacte de données — sont devenus le standard de facto de l'industrie. Dans cet article, nous allons voir comment implémenter un client OAuth 2.0 et travailler avec JWT en C++. Vous obtiendrez des exemples de code prêts à l'emploi et comprendrez comment intégrer ces mécanismes dans votre projet.
\n\nQu'est-ce que OAuth 2.0 et JWT : aperçu rapide
\n\nOAuth 2.0 est un protocole d'autorisation qui permet aux applications d'obtenir un accès limité aux ressources d'un utilisateur sans transmettre son identifiant et son mot de passe. Les principaux acteurs : Resource Owner (l'utilisateur), Client (notre application), Authorization Server (le serveur qui délivre les jetons) et Resource Server (le serveur qui fournit les données).
\n\nJWT est un format de jeton composé de trois parties : Header (algorithme de signature), Payload (données, par exemple l'ID utilisateur ou le rôle) et Signature (signature protégeant contre la falsification). JWT est souvent utilisé comme Bearer-token dans OAuth 2.0.
\n\nEn C++, nous utiliserons les bibliothèques cpprestsdk (pour les requêtes HTTP) et jwt-cpp (pour travailler avec JWT). Installez-les via vcpkg :
vcpkg install cpprestsdk\nvcpkg install jwt-cpp\n\nImplémentation d'un client OAuth 2.0 en C++
\n\nConsidérons un scénario typique : notre application C++ doit s'authentifier via Google OAuth 2.0. Pour cela, nous devons : enregistrer l'application dans Google Cloud Console, obtenir un Client ID et un Client Secret, puis exécuter le Authorization Code Flow.
\n\nÉtape 1 : Construction de l'URL d'autorisation
\n\nLa première étape consiste à rediriger l'utilisateur vers la page d'autorisation Google. Construisons l'URL avec les paramètres nécessaires :
\n\n#include <string>\n#include <cpprest/http_client.h>\n#include <cpprest/uri_builder.h>\n\nusing namespace web;\nusing namespace web::http;\nusing namespace web::http::client;\n\nstd::string BuildAuthorizationUrl(const std::string& client_id,\n const std::string& redirect_uri,\n const std::string& state) {\n uri_builder builder(U("https://accounts.google.com/o/oauth2/v2/auth"));\n builder.append_query(U("client_id"), utility::conversions::to_string_t(client_id));\n builder.append_query(U("redirect_uri"), utility::conversions::to_string_t(redirect_uri));\n builder.append_query(U("response_type"), U("code"));\n builder.append_query(U("scope"), U("openid%20email%20profile"));\n builder.append_query(U("state"), utility::conversions::to_string_t(state));\n builder.append_query(U("access_type"), U("offline"));\n builder.append_query(U("prompt"), U("consent"));\n return utility::conversions::to_utf8string(builder.to_uri().to_string());\n}\n\nÉtape 2 : Échange du code contre un jeton
\n\nUne fois que l'utilisateur a confirmé l'accès, Google le redirige vers notre redirect_uri avec le paramètre code. Ce code doit être échangé contre un access_token et un refresh_token :
pplx::task<web::json::value> ExchangeCodeForToken(\n const std::string& client_id,\n const std::string& client_secret,\n const std::string& redirect_uri,\n const std::string& code) {\n \n http_client client(U("https://oauth2.googleapis.com/token"));\n \n web::json::value body;\n body[U("code")] = web::json::value::string(utility::conversions::to_string_t(code));\n body[U("client_id")] = web::json::value::string(utility::conversions::to_string_t(client_id));\n body[U("client_secret")] = web::json::value::string(utility::conversions::to_string_t(client_secret));\n body[U("redirect_uri")] = web::json::va