Jetons JWT en Rust : bibliothèques et implémentation de l'authentification

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Jetons JWT en Rust : bibliothèques et implémentation de l'authentification

\n

JSON Web Token (JWT) est un standard ouvert pour la création de jetons d'accès, basé sur le format JSON. Dans l'écosystème Rust, le travail avec JWT est implémenté via plusieurs bibliothèques de qualité, parmi lesquelles jsonwebtoken est la plus importante. Cet outil assure le cycle complet de travail avec les jetons : création, signature, vérification et décodage.

\n\n

Bibliothèques principales pour JWT en Rust

\n

Actuellement, les crates les plus populaires pour travailler avec JWT sont :

\n
    \n
  • jsonwebtoken — la bibliothèque principale avec prise en charge des algorithmes HS256, RS256, EdDSA
  • \n
  • jwt — une alternative plus légère avec des fonctionnalités de base
  • \n
  • biscuit — une bibliothèque avancée avec prise en charge de scénarios complexes
  • \n
\n

Dans cet article, nous nous concentrerons sur jsonwebtoken comme la solution la plus mature et la mieux documentée.

\n\n

Installation et configuration

\n

Ajoutez la dépendance dans Cargo.toml :

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

Création et vérification des jetons JWT

\n

Examinons un exemple complet d'implémentation de l'authentification avec 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,        // identifiant de l'utilisateur\n    exp: usize,         // date d'expiration du jeton\n    iat: usize,         // date de création du jeton\n    role: String,       // rôle de l'utilisateur\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

Utilisation pratique dans une application web

\n

L'intégration de JWT avec les frameworks web (par exemple, Actix-web ou Axum) nécessite la création d'un middleware pour la vérification des jetons :

\n\n
use actix_web::{HttpRequest, HttpResponse, web, App, HttpServer, middleware::from_fn};\nuse std::sync::Arc;\n\n// Middleware pour la vérification JWT\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("Jeton manquant"))?;\n    \n    let token = auth_header\n        .strip_prefix("Bearer ")\n        .ok_or(HttpResponse::Unauthorized().json("Format de jeton invalide"))?;\n    \n    verify_token(token, SECRET)\n        .map_err(|_| HttpResponse::Unauthorized().json("Jeton invalide"))\n}\n\n// Point d'accès protégé\nasync fn protected_endpoint(claims: Claims) -> HttpResponse {\n    HttpResponse::Ok().json(claims)\n}
\n\n

Fonctionnalités avancées et bonnes pratiques

\n
    \n
  • Jetons de rafraîchissement — utilisez des jetons d'accès à courte durée de vie (15-30 minutes) et des jetons de rafraîchissement à longue durée de vie (7-30 jours)
  • \n
  • Stockage des secrets — ne stockez jamais les clés secrètes dans le code, utilisez des variables d'environnement ou un stockage sécurisé
  • \n
  • Algorithmes de signature — pour la production, utilisez RS256 (chiffrement asymétrique) plutôt que HS256
  • \n
  • Va
  • \n

Recommendations