Bibliothek cpp-httplib: OAuth 2.0-Client in C++ für Webanwendungen

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-Client in C++ mit cpp-httplib

\n\n

In der modernen Softwareentwicklung ist die Integration mit externen Diensten über OAuth 2.0 zum De-facto-Standard geworden. Für die Sprache C++, die traditionell mit Systemprogrammierung assoziiert wird, gibt es mehrere Möglichkeiten, einen OAuth-Client zu implementieren. Eine der einfachsten und effizientesten Lösungen ist die Bibliothek cpp-httplib – eine Single-Header-HTTP/HTTPS-Bibliothek, die es ermöglicht, sowohl Server- als auch Client-Anwendungen ohne externe Abhängigkeiten zu erstellen.

\n\n

In diesem Artikel werden wir untersuchen, wie man cpp-httplib verwendet, um einen vollwertigen OAuth 2.0-Client zu erstellen, der sich über Google, GitHub, VK und andere Anbieter autorisieren kann. Das Material richtet sich an C++-Programmierer, die Desktop- oder eingebetteten Anwendungen eine Authentifizierung hinzufügen möchten.

\n\n

Was ist cpp-httplib?

\n\n

cpp-httplib (auch bekannt als httplib.h) ist eine Header-only-Bibliothek für C++11/14/17, geschrieben von Yuji Hirose. Sie bietet eine einfache und intuitive API zum Ausführen von HTTP-Anfragen und zum Erstellen von HTTP-Servern. Unterstützt SSL/TLS (über OpenSSL oder MbedTLS), Proxys, Cookies und asynchrone Anfragen.

\n\n
    \n
  • Header-only – es reicht, eine einzige Datei in das Projekt zu kopieren.
  • \n
  • HTTPS-Unterstützung – sichere Verbindung für OAuth.
  • \n
  • Kleine Größe – etwa 8000 Zeilen Code.
  • \n
  • Plattformunabhängigkeit – Windows, Linux, macOS, BSD.
  • \n
\n\n

Für OAuth 2.0 müssen wir GET- und POST-Anfragen an die Endpunkte des Anbieters senden sowie Weiterleitungen verarbeiten. cpp-httplib meistert dies hervorragend.

\n\n

Architektur eines OAuth 2.0-Clients in C++

\n\n

Ein typischer OAuth 2.0 Authorization Code Flow umfasst die folgenden Schritte:

\n
    \n
  1. Die Anwendung öffnet den Browser des Benutzers mit der Autorisierungs-URL.
  2. \n
  3. Der Benutzer bestätigt den Zugriff.
  4. \n
  5. Der Anbieter leitet zur Callback-URL mit einem temporären Code weiter.
  6. \n
  7. Die Anwendung tauscht den Code gegen ein Access Token ein.
  8. \n
  9. Mit dem Token werden Anfragen an die API gesendet.
  10. \n
\n\n

In C++ können wir dies implementieren, indem wir einen lokalen HTTP-Server (mit cpp-httplib) starten, um den Callback abzufangen. Alternativ kann ein eingebetteter Browser verwendet und die URL über Systemereignisse verfolgt werden, aber der Server-Ansatz ist einfacher.

\n\n

Implementierungsbeispiel: OAuth über GitHub

\n\n

Betrachten wir ein vollständiges Beispiel eines Clients, der sich über GitHub OAuth autorisiert. Dafür muss eine OAuth-App bei GitHub registriert und eine Client-ID sowie ein Client-Secret eingeholt werden.

\n\n
#include <httplib.h>\n#include <iostream>\n#include <string>\n#include <thread>\n#include <regex>\n\n// Konfiguration\nconst std::string CLIENT_ID = "ihre_client_id";\nconst std::string CLIENT_SECRET = "ihr_client_secret";\nconst std::string REDIRECT_URI = "http://localhost:8080/callback";\nconst std::string AUTH_URL = "https://github.com/login/oauth/authorize";\nconst std::string TOKEN_URL = "https://github.com/login/oauth/access_token";\nconst std::string API_URL = "https://api.github.com/user";\n\nstd::string auth_code;\n\nvoid start_local_server() {\n    httplib::Server svr;\n    \n    svr.Get("/callback", [&](const httplib::Request& req, httplib::Response& res) {\n        // Extrahiere den Code aus den Query-Parametern\n        if (req.has_param("code")) {\n            auth_code = req.get_param_value("code");\n            res.set_content("<h2>Autorisierung erfolgreich! Schließen Sie das Fenster.</h2>", "text/html");\n            svr.stop();\n        } else {\n            res.set_content("<h2>Autorisierungsfehler</h2>", "text/html");\n        }\n    });\n    \n    std::cout << "Server gestartet auf Port 8080..." << std::endl;\n    svr.listen("0.0.0.0", 8080);\n}\n\nint main() {\n    // Schritt 1: Erstelle die Autorisierungs-URL\n    std::string auth_url = AUTH_URL + "?clien                    

Empfehlungen