JWT-Tokens in Rust: Bibliotheken und Implementierung der Authentifizierung
\nJSON Web Token (JWT) ist ein offener Standard zur Erstellung von Zugriffstokens, der auf dem JSON-Format basiert. Im Rust-Ökosystem wird die Arbeit mit JWT durch mehrere hochwertige Bibliotheken realisiert, unter denen jsonwebtoken führend ist. Dieses Tool bietet den vollständigen Zyklus der Arbeit mit Tokens: Erstellung, Signierung, Verifizierung und Dekodierung.
\n\nWichtige Bibliotheken für JWT in Rust
\nAktuell die beliebtesten Crates für die Arbeit mit JWT:
\n- \n
- jsonwebtoken — die Hauptbibliothek mit Unterstützung für HS256-, RS256- und EdDSA-Algorithmen \n
- jwt — eine leichtere Alternative mit grundlegender Funktionalität \n
- biscuit — eine erweiterte Bibliothek mit Unterstützung für komplexe Szenarien \n
In diesem Artikel konzentrieren wir uns auf jsonwebtoken als die ausgereifteste und am besten dokumentierte Lösung.
Installation und Konfiguration
\nFügen Sie die Abhängigkeit in Cargo.toml hinzu:
[dependencies]\njsonwebtoken = "9.3"\nserde = { version = "1.0", features = ["derive"] }\nchrono = "0.4"\n\nErstellung und Verifizierung von JWT-Tokens
\nBetrachten wir ein vollständiges Beispiel zur Implementierung der Authentifizierung mit JWT:
\n\nuse jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};\nuse serde::{Serialize, Deserialize};\nuse chrono::{Utc, Duration};\n\n#[derive(Debug, Serialize, Deserialize)]\nstruct Claims {\n sub: String, // Benutzer-ID\n exp: usize, // Ablaufzeit des Tokens\n iat: usize, // Erstellungszeit des Tokens\n role: String, // Benutzerrolle\n}\n\nfn create_token(user_id: &str, role: &str, secret: &str) -> Result {\n let now = Utc::now();\n let claims = Claims {\n sub: user_id.to_string(),\n exp: (now + Duration::hours(24)).timestamp() as usize,\n iat: now.timestamp() as usize,\n role: role.to_string(),\n };\n \n encode(\n &Header::default(),\n &claims,\n &EncodingKey::from_secret(secret.as_bytes())\n )\n}\n\nfn verify_token(token: &str, secret: &str) -> Result {\n let token_data = decode::(\n token,\n &DecodingKey::from_secret(secret.as_bytes()),\n &Validation::default()\n )?;\n Ok(token_data.claims)\n} \n\nPraktische Verwendung in einer Webanwendung
\nDie Integration von JWT mit Web-Frameworks (z. B. Actix-web oder Axum) erfordert die Erstellung einer Middleware zur Überprüfung von Tokens:
\n\nuse actix_web::{HttpRequest, HttpResponse, web, App, HttpServer, middleware::from_fn};\nuse std::sync::Arc;\n\n// Middleware zur JWT-Überprüfung\nasync fn auth_middleware(\n req: HttpRequest,\n) -> Result {\n let auth_header = req.headers()\n .get("Authorization")\n .and_then(|v| v.to_str().ok())\n .ok_or(HttpResponse::Unauthorized().json("Missing token"))?;\n \n let token = auth_header\n .strip_prefix("Bearer ")\n .ok_or(HttpResponse::Unauthorized().json("Invalid token format"))?;\n \n verify_token(token, SECRET)\n .map_err(|_| HttpResponse::Unauthorized().json("Invalid token"))\n}\n\n// Geschützter Endpunkt\nasync fn protected_endpoint(claims: Claims) -> HttpResponse {\n HttpResponse::Ok().json(claims)\n} \n\nErweiterte Funktionen und bewährte Verfahren
\n- \n
- Refresh-Tokens — verwenden Sie kurzlebige Access-Tokens (15-30 Minuten) und langlebige Refresh-Tokens (7-30 Tage) \n
- Speicherung von Geheimnissen — speichern Sie geheime Schlüssel niemals im Code, verwenden Sie Umgebungsvariablen oder einen sicheren Speicher \n
- Signaturalgorithmen — verwenden Sie für die Produktion RS256 (asymmetrische Verschlüsselung) anstelle von HS256 \n
- Wa
Auch in der Bibliothek
Arbeiten mit Kafka in Swift (iOS/macOS): Bibliotheken, Clients und Beispiele
Aufgabenwarteschlangen für Rust: Überblick über beliebte Bibliotheken und Tools
Verwaltung der Konfiguration von TypeScript-Anwendungen: Vollständiger Leitfaden
C++ Benchmark: Vollständige Anleitung mit Beispielen
Supertest für JavaScript (Node.js): Komplettguide mit Beispielen