Einführung in OAuth 2.0 und JWT in C++
\n\nModerne Webanwendungen und APIs kommen selten ohne Autorisierungssysteme aus. Die beiden beliebtesten Standards – OAuth 2.0 und JWT (JSON Web Token) – sind zur Grundlage der Sicherheit für Millionen von Diensten geworden. In diesem Artikel werden wir uns ansehen, wie man eine grundlegende OAuth 2.0-Autorisierung mit JWT-Token in der Sprache C++ implementiert. Sie erfahren, wie diese Protokolle funktionieren, und sehen fertige Codebeispiele, die Sie an Ihr Projekt anpassen können.
\n\nDer Artikel richtet sich an Anfänger-Entwickler, die bereits mit den Grundlagen von C++ vertraut sind (Klassen, Funktionen, Netzwerkarbeit) und ihren Anwendungen eine sichere Autorisierung hinzufügen möchten. Wir werden keine externen Bibliotheken für den HTTP-Server verwenden – alle Beispiele basieren auf reinem C++ mit minimalen Abhängigkeiten.
\n\nWas ist OAuth 2.0 und wozu wird es benötigt?
\n\nOAuth 2.0 ist ein Autorisierungsprotokoll, das es Anwendungen ermöglicht, eingeschränkten Zugriff auf die Ressourcen eines Benutzers zu erhalten, ohne dessen Passwort weiterzugeben. Stellen Sie sich vor, Sie möchten einer Anwendung Zugriff auf Ihre Fotos auf einem Server gewähren. Anstatt Ihren Benutzernamen und Ihr Passwort einzugeben, durchlaufen Sie einen Authorization Server, der ein temporäres Token ausstellt. Die Anwendung verwendet dieses Token, um auf die Ressourcen zuzugreifen.
\n\nDie Hauptrollen in OAuth 2.0:
\n- \n
- Resource Owner – der Benutzer, der Eigentümer der Daten. \n
- Client – die Anwendung, die Zugriff anfordert. \n
- Authorization Server – der Server, der nach der Authentifizierung Token ausstellt. \n
- Resource Server – der Server, der die geschützten Daten speichert (z. B. API). \n
In C++ implementieren wir eine vereinfachte Version des Authorization Server und Resource Server unter Verwendung von JWT als Zugriffstoken.
\n\nJWT: Struktur und Funktionsweise
\n\nJWT (JSON Web Token) ist eine kompakte und in sich geschlossene Möglichkeit, Informationen zwischen Parteien in Form eines JSON-Objekts zu übertragen. Das Token besteht aus drei Teilen, die durch Punkte getrennt sind:
\n\nheader.payload.signature\n\nHeader enthält den Tokentyp und den Signaturalgorithmus (normalerweise HMAC SHA256 oder RSA). Payload ist die Nutzlast: Benutzer-ID, Token-Lebensdauer, Rollen usw. Signature ist die Signatur, die die Integrität der Daten überprüft.
\n\nBeispiel für die Erstellung eines JWT in C++ ohne Bibliotheken (vereinfacht):
\n\n#include <iostream>\n#include <sstream>\n#include <vector>\n#include <openssl/sha.h>\n#include <openssl/hmac.h>\n\nstd::string base64_encode(const std::string &input) {\n // Vereinfachte Base64-Implementierung (für das Beispiel)\n static const char* lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\n std::string result;\n // ... Codierungscode ...\n return result;\n}\n\nstd::string create_jwt(const std::string &payload, const std::string &secret) {\n std::string header = R"({"alg":"HS256","typ":"JWT"})";\n std::string header_b64 = base64_encode(header);\n std::string payload_b64 = base64_encode(payload);\n std::string data = header_b64 + "." + payload_b64;\n \n unsigned char* sig = HMAC(EVP_sha256(), secret.c_str(), secret.length(), \n (unsigned char*)data.c_str(), data.length(), NULL, NULL);\n std::string sig_b64 = base64_encode(std::string((char*)sig, 32));\n \n return data + "." + sig_b64;\n}\n\nint main() {\n std::string payload = R"({"user_id":123,"role":"admin","exp":1700000000})";\n std::string token = create_jwt(payload, "my_secret_key");\n std::cout << "JWT: " << token << std::endl;\n return 0;\n}\n\nDieser Code erstellt ein JWT mit dem Header HS256 und der Nutzlast. Verwenden Sie in realen Projekten bewährte Bibliotheken wie jwt-cpp oder libjwt, aber für das Verständnis des Wesens reicht auch ein solcher