OAuth 2.0 und JWT-Autorisierung in C++: Vollständige Anleitung mit Code

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

OAuth 2.0 und JWT-Autorisierung in C++: in der Praxis

\n\n

Moderne Webanwendungen und Mikroservices kommen selten ohne Autorisierungssysteme aus. Die beiden beliebtesten Standards – OAuth 2.0 für die Delegierung des Zugriffs und JWT (JSON Web Token) für die kompakte Datenübertragung – sind zum De-facto-Standard der Branche geworden. In diesem Artikel werden wir uns ansehen, wie man einen OAuth 2.0-Client und die Arbeit mit JWT in C++ implementiert. Sie erhalten fertige Codebeispiele und verstehen, wie Sie diese Mechanismen in Ihr Projekt integrieren können.

\n\n

Was sind OAuth 2.0 und JWT: Ein kurzer Überblick

\n\n

OAuth 2.0 ist ein Autorisierungsprotokoll, das es Anwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne dessen Login und Passwort zu übertragen. Die Hauptbeteiligten sind: Resource Owner (Benutzer), Client (unsere Anwendung), Authorization Server (Server, der Tokens ausstellt) und Resource Server (Server, der Daten bereitstellt).

\n\n

JWT ist ein Token-Format, das aus drei Teilen besteht: Header (Signaturalgorithmus), Payload (Daten, z. B. Benutzer-ID oder Rolle) und Signature (Signatur, die vor Fälschung schützt). JWT wird häufig als Bearer-Token in OAuth 2.0 verwendet.

\n\n

In C++ werden wir die Bibliotheken cpprestsdk (für HTTP-Anfragen) und jwt-cpp (für die Arbeit mit JWT) verwenden. Installieren Sie sie über vcpkg:

\n\n
vcpkg install cpprestsdk\nvcpkg install jwt-cpp
\n\n

Implementierung eines OAuth 2.0-Clients in C++

\n\n

Betrachten wir ein typisches Szenario: Unsere C++-Anwendung muss sich über Google OAuth 2.0 autorisieren. Dazu müssen wir: die Anwendung in der Google Cloud Console registrieren, Client ID und Client Secret erhalten und dann den Authorization Code Flow durchführen.

\n\n

Schritt 1: Erstellung der URL für die Autorisierung

\n\n

Der erste Schritt besteht darin, den Benutzer auf die Google-Autorisierungsseite weiterzuleiten. Erstellen wir eine URL mit den erforderlichen Parametern:

\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

Schritt 2: Austausch des Codes gegen ein Token

\n\n

Nachdem der Benutzer den Zugriff bestätigt hat, leitet Google ihn auf unsere redirect_uri mit dem Parameter code weiter. Dieser Code muss gegen access_token und refresh_token eingetauscht werden:

\n\n
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                

Blogs

Buchempfehlungen