OAuth 2.0 und JWT-Autorisierung in Rust: Schritt-für-Schritt-Anleitung für Anfänger

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

Einleitung: Warum ist Autorisierung in Rust notwendig?

Moderne Webanwendungen kommen selten ohne ein Authentifizierungs- und Autorisierungssystem aus. Rust wird aufgrund seiner Leistungsfähigkeit und Speichersicherheit zunehmend zur Erstellung hochbelastbarer Dienste gewählt. Allerdings kann die Arbeit mit Protokollen wie OAuth 2.0 und dem JWT-Format für Anfänger komplex erscheinen.

In diesem Artikel werden wir die grundlegenden Konzepte von OAuth 2.0 und JWT (JSON Web Token) erläutern und ein einfaches Autorisierungssystem in Rust unter Verwendung beliebter Crates implementieren. Sie erfahren, wie Sie Ihre API-Endpunkte schützen und mit Zugriffstoken arbeiten.



Was sind OAuth 2.0 und JWT?

Bevor wir Code schreiben, ist es wichtig, die Theorie zu verstehen.



OAuth 2.0: Protokoll für delegierten Zugriff

OAuth 2.0 ist ein Protokoll, das es einer Anwendung ermöglicht, eingeschränkten Zugriff auf die Ressourcen eines Benutzers zu erhalten, ohne dessen Login und Passwort zu übertragen. Stellen Sie sich vor, Sie möchten sich über Google oder GitHub auf einer Website anmelden – das ist OAuth 2.0.

Die Hauptakteure des Protokolls:

  • Resource Owner – der Benutzer, der die Daten besitzt.
  • Client – Ihre Rust-Anwendung, die Zugriff erhalten möchte.
  • Authorization Server – der Server, der Token ausstellt (z. B. Google).
  • Resource Server – die API, die Daten bereitstellt (z. B. Google Drive).


JWT: Kompaktes Token-Format

JWT (JSON Web Token) ist ein offener Standard zur Erstellung von Zugriffstoken. Das Token besteht aus drei durch Punkte getrennten Teilen:

  • Header – Token-Typ und Signaturalgorithmus.
  • Payload – Daten (Claims), z. B. Benutzer-ID oder Rolle.
  • Signature – Signatur, die garantiert, dass das Token nicht verändert wurde.

Beispiel eines JWT: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNrxP0G7n9G4W7N8Y7J8

JWT ist praktisch, da es keine Speicherung von Sitzungen auf dem Server erfordert – alle Informationen sind bereits im Token enthalten.



Einrichtung des Rust-Projekts für die Autorisierung

Wir verwenden das Framework Actix Web und einige Hilfs-Crates. Erstellen Sie ein neues Projekt:

cargo new rust-auth-examplecd rust-auth-example


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

[dependencies]actix-web = "4"actix-rt = "2"serde = { version = "1", features = ["derive"] }serde_json = "1"jsonwebtoken = "9"chrono = { version = "0.4", features = ["serde"] }dotenv = "0.15"env_logger = "0.10"bcrypt = "0.15"


Dateistruktur

Zur besseren Übersicht erstellen wir eine modulare Struktur:

src/├── main.rs├── auth.rs├── models.rs└── handlers.rs


In .env hinterlegen wir den geheimen Schlüssel für JWT:

JWT_SECRET=supersecretkey12345DATABASE_URL=sqlite://users.db


Implementierung von JWT in Rust: Von der Generierung bis zur Verifizierung

Beginnen wir mit dem Modul auth.rs, das für die Arbeit mit JWT zuständig ist.



Strukturen für JWT

// auth.rsuse serde::{Deserialize, Serialize};use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};use chrono::{Utc, Duration};

#[derive(Debug, Serialize, Deserialize)]pub struct Claims { pub sub: String, // Benutzer-ID pub exp: usize, // Ablaufzeit pub iat: usize, // Ausstellungszeit}

pub fn create_jwt(user_id: &str, secret: &str) -> Result<String, jsonwebtoken::errors::Error> { let now = Utc::now(); let expiration = now + Duration::hours(24); // Token lebt 24 Stunden

let claims = Claims { sub: user_id.to_owned(), exp: expiration.timestamp() as usize, iat: now.timestamp() as usize, };

let token = encode( &Header::default(), &claims,\

Blogs

Buchempfehlungen