Tokens JWT en Rust: bibliotecas e implementación de autenticación

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Tokens JWT en Rust: bibliotecas e implementación de autenticación

\n

JSON Web Token (JWT) es un estándar abierto para la creación de tokens de acceso, basado en el formato JSON. En el ecosistema de Rust, el trabajo con JWT se implementa a través de varias bibliotecas de calidad, entre las cuales lidera jsonwebtoken. Esta herramienta proporciona el ciclo completo de trabajo con tokens: creación, firma, verificación y decodificación.

\n\n

Bibliotecas principales para JWT en Rust

\n

Actualmente, los crates más populares para trabajar con JWT son:

\n
    \n
  • jsonwebtoken — la biblioteca principal con soporte para algoritmos HS256, RS256, EdDSA
  • \n
  • jwt — una alternativa más ligera con funcionalidad básica
  • \n
  • biscuit — una biblioteca avanzada con soporte para escenarios complejos
  • \n
\n

En este artículo nos centraremos en jsonwebtoken como la solución más madura y documentada.

\n\n

Instalación y configuración

\n

Agregue la dependencia en Cargo.toml:

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

Creación y verificación de tokens JWT

\n

Veamos un ejemplo completo de implementación de autenticación con 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,        // identificador de usuario\n    exp: usize,         // tiempo de expiración del token\n    iat: usize,         // tiempo de creación del token\n    role: String,       // rol del usuario\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

Uso práctico en una aplicación web

\n

La integración de JWT con frameworks web (por ejemplo, Actix-web o Axum) requiere crear un middleware para la verificación de tokens:

\n\n
use actix_web::{HttpRequest, HttpResponse, web, App, HttpServer, middleware::from_fn};\nuse std::sync::Arc;\n\n// Middleware para verificar 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("Token faltante"))?;\n    \n    let token = auth_header\n        .strip_prefix("Bearer ")\n        .ok_or(HttpResponse::Unauthorized().json("Formato de token inválido"))?;\n    \n    verify_token(token, SECRET)\n        .map_err(|_| HttpResponse::Unauthorized().json("Token inválido"))\n}\n\n// Endpoint protegido\nasync fn protected_endpoint(claims: Claims) -> HttpResponse {\n    HttpResponse::Ok().json(claims)\n}
\n\n

Funcionalidades avanzadas y mejores prácticas

\n
    \n
  • Tokens de actualización (Refresh) — use tokens de acceso de corta duración (15-30 minutos) y tokens de actualización de larga duración (7-30 días)
  • \n
  • Almacenamiento de secretos — nunca almacene claves secretas en el código, use variables de entorno o un almacenamiento seguro
  • \n
  • Algoritmos de firma — para producción, use RS256 (cifrado asimétrico) en lugar de HS256
  • \n
  • Va

Recommendations