Einführung in Authentifizierung und Autorisierung in C++
Authentifizierung (Überprüfung der Benutzeridentität) und Autorisierung (Überprüfung der Zugriffsrechte) sind Schlüsselkomponenten der Sicherheit jeder modernen Anwendung. In C++ werden diese Aufgaben mit Hilfe spezialisierter Bibliotheken gelöst, die die Unterstützung von JWT-Tokens, OAuth 2.0, Passwort-Hashing und Session-Verwaltung ermöglichen. In diesem Artikel analysieren wir die wichtigsten Werkzeuge, ihre Installation und Anwendungsbeispiele.
Wichtige Bibliotheken für die Authentifizierung in C++
1. JWT-CPP — Arbeiten mit JSON Web Tokens
JWT-CPP ist eine leichte Bibliothek zum Erstellen und Verifizieren von JWT-Tokens. Unterstützt die Algorithmen HMAC, RSA und ECDSA. Ideal für REST-APIs und Microservices.
Installation:
git clone https://github.com/Thalhammer/jwt-cppcd jwt-cppmkdir build && cd buildcmake ..make && make installBeispiel zum Erstellen und Überprüfen eines Tokens:
#include <jwt-cpp/jwt.h>#include <iostream>
int main() { // Token mit Payload erstellen auto token = jwt::create() .set_issuer("auth.example.com") .set_type("JWS") .set_payload_claim("user_id", jwt::claim(std::string("12345"))) .sign(jwt::algorithm::hs256{"secret_key"});
std::cout << "Token: " << token << std::endl;
// Token verifizieren auto decoded = jwt::decode(token); auto verifier = jwt::verify() .allow_algorithm(jwt::algorithm::hs256{"secret_key"}) .with_issuer("auth.example.com");
try { verifier.verify(decoded); std::cout << "Token valid. User ID: " << decoded.get_payload_claim("user_id").as_string() << std::endl; } catch (const std::exception& e) { std::cerr << "Invalid token: " << e.what() << std::endl; } return 0;}2. bcrypt-cpp — Passwort-Hashing
Die Bibliothek bcrypt-cpp bietet sicheres Passwort-Hashing mit dem Blowfish-Algorithmus. Beinhaltet automatische Salt-Generierung und Schutz vor Brute-Force-Angriffen.
Anwendungsbeispiel:
#include <bcrypt/BCrypt.hpp>#include <iostream>
int main() { std::string password = "SuperSecret123!";
// Passwort hashen std::string hash = BCrypt::generateHash(password); std::cout << "Hash: " << hash << std::endl;
// Passwort überprüfen if (BCrypt::validatePassword(password, hash)) { std::cout << "Password correct!" << std::endl; } else { std::cout << "Invalid password." << std::endl; } return 0;}3. OAuth2 Client — Integration mit Anbietern
Für die Implementierung der Anmeldung über Google, GitHub oder Facebook verwenden Sie die Bibliothek cpp-httplib in Kombination mit manueller Verarbeitung von OAuth2-Abläufen. Beispiel zum Abrufen eines Access Tokens über HTTP-Anfragen:
#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>
int main() { httplib::Client cli("https://oauth2.googleapis.com");
// Anfrageparameter (durch eigene ersetzen) auto res = cli.Post("/token", { {"code", "authorization_code"}, {"client_id", "YOUR_CLIENT_ID"}, {"client_secret", "YOUR_CLIENT_SECRET"}, {"redirect_uri", "http://localhost:8080/callback"}, {"grant_type", "authorization_code"} });
if (res && res->status == 200) { auto json = nlohmann::json::parse(res->body); std::cout << "Access token: " << json["access_token"].get<std::string>() << std::endl; } else { std::cerr << "Failed to get token" << std::endl; } return 0;}