Einführung in OAuth 2.0 und JWT in C++
In der modernen Webentwicklung sind Sicherheit und Zugriffsverwaltung kritisch wichtige Aspekte. OAuth 2.0 und JWT (JSON Web Tokens) sind zum De-facto-Standard für die Implementierung von Autorisierung in APIs und Webanwendungen geworden. Obwohl diese Technologien häufiger mit JavaScript, Python oder Java assoziiert werden, bietet auch C++ leistungsstarke Werkzeuge für ihre Implementierung.
In diesem Artikel analysieren wir, wie OAuth 2.0 und JWT funktionieren, und zeigen praktische Beispiele ihrer Implementierung in C++. Das Material richtet sich an Anfänger, die mit den Grundlagen von C++ und Netzwerkprogrammierung vertraut sind.
Was ist OAuth 2.0?
OAuth 2.0 ist ein Autorisierungsprotokoll, das es Anwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne deren Anmeldedaten (Benutzername und Passwort) zu übertragen. Stattdessen werden Zugriffstoken verwendet. Die Hauptrollen in OAuth 2.0 sind:
- Resource Owner (Ressourcenbesitzer) — der Benutzer, dem die Daten gehören.
- Client (Client) — die Anwendung, die Zugriff anfordert.
- Authorization Server (Autorisierungsserver) — stellt Token nach erfolgreicher Authentifizierung aus.
- Resource Server (Ressourcenserver) — die durch Token geschützte API.
Was ist JWT?
JWT (JSON Web Token) ist ein kompaktes Token-Format, das ein JSON-Objekt mit Daten (Claims) enthält und zur Integritätsprüfung signiert ist. Die Struktur von JWT besteht aus drei durch Punkte getrennten Teilen:
- Header (Kopfzeile) — enthält den Tokentyp und den Signaturalgorithmus (z. B. HS256 oder RS256).
- Payload (Nutzlast) — enthält die Daten (z. B. Benutzer-ID, Ablaufdatum).
- Signature (Signatur) — wird durch Hashing von Header + Payload mit einem geheimen Schlüssel erstellt.
Der Vorteil von JWT besteht darin, dass es autark ist: Der Ressourcenserver kann das Token überprüfen, ohne den Autorisierungsserver kontaktieren zu müssen, was die Leistung beschleunigt.
Hauptteil: Implementierung in C++
1. Bibliotheken und Umgebungsvorbereitung
Für die Arbeit mit OAuth 2.0 und JWT in C++ benötigen wir die folgenden Bibliotheken:
- cURL (libcurl) — für HTTP-Anfragen an den Autorisierungsserver.
- nlohmann/json — für die Arbeit mit JSON.
- jwt-cpp — zum Erstellen und Überprüfen von JWT-Token.
- OpenSSL — für kryptografische Operationen (Signierung und Hashing).
Installation über vcpkg (empfohlen):
vcpkg install curl jsoncpp jwt-cpp opensslBeispiel CMakeLists.txt:
cmake_minimum_required(VERSION 3.15)project(OAuthJWTExample)
find_package(CURL REQUIRED)find_package(nlohmann_json REQUIRED)find_package(jwt-cpp REQUIRED)find_package(OpenSSL REQUIRED)
add_executable(main main.cpp)target_link_libraries(main CURL::libcurl nlohmann_json::nlohmann_json jwt-cpp::jwt-cpp OpenSSL::SSL OpenSSL::Crypto)2. Implementierung des OAuth 2.0 Authorization Code Flow
Betrachten wir den häufigsten Ablauf — den Authorization Code Flow. Der Client erhält einen Autorisierungscode vom Benutzer und tauscht ihn dann gegen ein Zugriffstoken ein.
Schritt 1: Weiterleitung des Benutzers zum Autorisierungsserver (vereinfachtes Beispiel):
#include <iostream>#include <string>
std::string buildAuthUrl(const std::string& clientId, const std::string& redirectUri) { return "https://auth.example.com/authorize?" "response_type=code&" "client_id=" + clientId + "&" "redirect_uri=" + redirectUri + "&" "scope=openid+profile";}
int main() { std::string clientId = "your_client_id"; std::string redirectUri = "http://lo