OAuth-Client für Rust: Bibliothek oauth2
OAuth 2.0 ist der Industriestandard für die Delegierung des Zugriffs. Es wird häufig zur Autorisierung von Benutzern über Drittanbieterdienste (Google, GitHub, Facebook) verwendet, ohne dass ein Passwort weitergegeben werden muss. Im Rust-Ökosystem ist oauth2 (Crate oauth2) eine der beliebtesten und ausgereiftesten Bibliotheken zur Implementierung von OAuth 2.0. Sie bietet eine sichere, asynchrone und flexible API für die Arbeit mit beliebigen OAuth-Anbietern.
Hauptfunktionen
- Unterstützung aller Standard-Grants: Authorization Code, Client Credentials, Resource Owner Password Credentials, Implicit.
- Integrierte PKCE-Unterstützung (Proof Key for Code Exchange) zur Erhöhung der Sicherheit öffentlicher Clients.
- Asynchrone Arbeitsweise unter Verwendung von
reqwestoderureqim Hintergrund. - Typsicherheit: Alle Token, URLs und Parameter sind streng typisiert, wodurch Fehler zur Kompilierzeit ausgeschlossen werden.
- Flexible Konfiguration für jeden Anbieter durch Konfiguration von Endpunkten und Scopes.
- Token-Verwaltung: Automatische Aktualisierung (Refresh), Überprüfung des Ablaufs der Gültigkeit.
Installation
Fügen Sie die Abhängigkeit zu Ihrer Cargo.toml hinzu:
[dependencies]oauth2 = "4.4"tokio = { version = "1", features = ["full"] }serde = { version = "1", features = ["derive"] }reqwest = { version = "0.11", features = ["json"] }Basisbeispiel: Autorisierung über Google
Betrachten wir den vollständigen OAuth 2.0-Zyklus mit dem Grant Authorization Code + PKCE für Google:
use oauth2::{ AuthorizationCode, AuthUrl, ClientId, ClientSecret, CsrfToken, PkceCodeChallenge, RedirectUrl, Scope, TokenResponse, TokenUrl,};use oauth2::basic::BasicClient;use oauth2::reqwest::async_http_client;use url::Url;
#[tokio::main]async fn main() -> Result<(), Box> { // 1. Client mit Google-Einstellungen erstellen let client = BasicClient::new( ClientId::new("IHRE_GOOGLE_CLIENT_ID".to_string()), Some(ClientSecret::new("IHRE_GOOGLE_CLIENT_SECRET".to_string())), AuthUrl::new("https://accounts.google.com/o/oauth2/v2/auth".to_string())?, Some(TokenUrl::new("https://oauth2.googleapis.com/token".to_string())?), ) .set_redirect_uri(RedirectUrl::new("http://localhost:8080/callback".to_string())?);
// 2. PKCE-Challenge generieren let (pkce_challenge, pkce_verifier) = PkceCodeChallenge::new_random_sha256();
// 3. URL für die Benutzerautorisierung erstellen let (auth_url, csrf_token) = client .authorize_url(CsrfToken::new_random) .add_scope(Scope::new("openid".to_string())) .add_scope(Scope::new("profile".to_string())) .add_scope(Scope::new("email".to_string())) .set_pkce_challenge(pkce_challenge) .url();
println!("Öffnen Sie im Browser: {}", auth_url);
// 4. (Simulation) Autorisierungscode vom Benutzer erhalten let code = "code_aus_dem_browser_nach_weiterleitung";
// 5. Code gegen Token eintauschen let token_response = client .exchange_code(AuthorizationCode::new(code.to_string())) .set_pkce_verifier(pkce_verifier) .request_async(async_http_client) .await?;
println!("Access-Token: {}", token_response.access_token().secret()); println!("Refresh-Token: {:?}", token_response.refresh_token());
Ok(())} Fortgeschrittene Szenarien
1. Token-Aktualisierung (Refresh Token)
Wenn das Access-Token abläuft, verwenden Sie das Refresh-Token, um ein neues zu erhalten:
use oauth2::RefreshToken;
let refresh_token = RefreshToken::new("ihr_refresh_token".to_string());let new_token = client .exchange_refresh_token(&refresh_token) .requ Auch in der Bibliothek
Geolokalisierung und Karten in JavaScript (Node.js): Bibliotheken und Werkzeuge
OAuth-Client für Go (Golang): Vollständiger Leitfaden zur Bibliothek
PDF-Generierung in C# (.NET): Überblick über Bibliotheken und Tools