JWT-Tokens in Rust: Bibliotheken und Implementierung der Authentifizierung

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

JWT-Tokens in Rust: Bibliotheken und Implementierung der Authentifizierung

\n

JSON 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\n

Wichtige Bibliotheken für JWT in Rust

\n

Aktuell 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
\n

In diesem Artikel konzentrieren wir uns auf jsonwebtoken als die ausgereifteste und am besten dokumentierte Lösung.

\n\n

Installation und Konfiguration

\n

Fügen Sie die Abhängigkeit in Cargo.toml hinzu:

\n
[dependencies]\njsonwebtoken = "9.3"\nserde = { version = "1.0", features = ["derive"] }\nchrono = "0.4"
\n\n

Erstellung und Verifizierung von JWT-Tokens

\n

Betrachten wir ein vollständiges Beispiel zur Implementierung der Authentifizierung mit JWT:

\n\n
use 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\n

Praktische Verwendung in einer Webanwendung

\n

Die Integration von JWT mit Web-Frameworks (z. B. Actix-web oder Axum) erfordert die Erstellung einer Middleware zur Überprüfung von Tokens:

\n\n
use 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\n

Erweiterte 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

Empfehlungen