Tokens JWT en Rust: bibliotecas e implementación de autenticación
\nJSON 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\nBibliotecas principales para JWT en Rust
\nActualmente, 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
En este artículo nos centraremos en jsonwebtoken como la solución más madura y documentada.
Instalación y configuración
\nAgregue la dependencia en Cargo.toml:
[dependencies]\njsonwebtoken = "9.3"\nserde = { version = "1.0", features = ["derive"] }\nchrono = "0.4"\n\nCreación y verificación de tokens JWT
\nVeamos un ejemplo completo de implementación de autenticación con 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, // 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\nUso práctico en una aplicación web
\nLa integración de JWT con frameworks web (por ejemplo, Actix-web o Axum) requiere crear un middleware para la verificación de tokens:
\n\nuse 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\nFuncionalidades 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
También en la biblioteca
Métricas de Prometheus en Node.js: biblioteca prom-client
Procesamiento de imágenes en Node.js: resize, crop con Sharp y Jimp
Framework CLI para PHP (Symfony Console)
Métricas de Prometheus en Go (Golang): guía completa de monitoreo
Generación de PDF en JavaScript (Node.js): bibliotecas y herramientas