Rust में JWT टोकन: लाइब्रेरी और प्रमाणीकरण कार्यान्वयन
JSON Web Token (JWT) एक ओपन स्टैंडर्ड है जो JSON फॉर्मेट पर आधारित एक्सेस टोकन बनाने के लिए उपयोग होता है। Rust इकोसिस्टम में JWT के साथ काम करने के लिए कई गुणवत्ता वाली लाइब्रेरी उपलब्ध हैं, जिनमें jsonwebtoken सबसे आगे है। यह टूल टोकन बनाने, साइन करने, सत्यापन और डिकोड करने का पूरा चक्र प्रदान करता है।
Rust में JWT के लिए मुख्य लाइब्रेरी
वर्तमान में JWT के लिए सबसे लोकप्रिय क्रेट्स:
- jsonwebtoken — मुख्य लाइब्रेरी जो HS256, RS256, EdDSA एल्गोरिदम सपोर्ट करती है
- jwt — बेसिक फंक्शनैलिटी वाला हल्का विकल्प
- biscuit — जटिल परिदृश्यों के लिए उन्नत लाइब्रेरी
इस लेख में हम jsonwebtoken पर फोकस करेंगे, जो सबसे परिपक्व और डॉक्यूमेंटेड समाधान है।
इंस्टॉलेशन और सेटअप
Cargo.toml में डिपेंडेंसी जोड़ें:
[dependencies]
jsonwebtoken = "9.3"
serde = { version = "1.0", features = ["derive"] }
chrono = "0.4"
JWT टोकन बनाना और सत्यापन
JWT के साथ प्रमाणीकरण का पूरा उदाहरण देखें:
use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};
use serde::{Serialize, Deserialize};
use chrono::{Utc, Duration};
#[derive(Debug, Serialize, Deserialize)]
struct Claims {
sub: String, // उपयोगकर्ता आईडी
exp: usize, // टोकन समाप्ति समय
iat: usize, // टोकन निर्माण समय
role: String, // उपयोगकर्ता भूमिका
}
fn create_token(user_id: &str, role: &str, secret: &str) -> Result {
let now = Utc::now();
let claims = Claims {
sub: user_id.to_string(),
exp: (now + Duration::hours(24)).timestamp() as usize,
iat: now.timestamp() as usize,
role: role.to_string(),
};
encode(
&Header::default(),
&claims,
&EncodingKey::from_secret(secret.as_bytes())
)
}
fn verify_token(token: &str, secret: &str) -> Result {
let token_data = decode::(
token,
&DecodingKey::from_secret(secret.as_bytes()),
&Validation::default()
)?;
Ok(token_data.claims)
}
वेब एप्लिकेशन में व्यावहारिक उपयोग
JWT को वेब फ्रेमवर्क (जैसे Actix-web या Axum) के साथ एकीकृत करने के लिए टोकन जांचने हेतु middleware बनाना होता है:
use actix_web::{HttpRequest, HttpResponse, web, App, HttpServer, middleware::from_fn};
use std::sync::Arc;
// JWT जांचने के लिए Middleware
async fn auth_middleware(
req: HttpRequest,
) -> Result {
let auth_header = req.headers()
.get("Authorization")
.and_then(|v| v.to_str().ok())
.ok_or(HttpResponse::Unauthorized().json("टोकन नहीं मिला"))?;
let token = auth_header
.strip_prefix("Bearer ")
.ok_or(HttpResponse::Unauthorized().json("गलत टोकन फॉर्मेट"))?;
verify_token(token, SECRET)
.map_err(|_| HttpResponse::Unauthorized().json("अमान्य टोकन"))
}
// सुरक्षित एंडपॉइंट
async fn protected_endpoint(claims: Claims) -> HttpResponse {
HttpResponse::Ok().json(claims)
}
उन्नत सुविधाएं और सर्वोत्तम अभ्यास
- Refresh टोकन — छोटी अवधि वाले access टोकन (15-30 मिनट) और लंबी अवधि वाले refresh टोकन (7-30 दिन) का उपयोग करें
- सीक्रेट स्टोरेज — सीक्रेट कुंजियों को कोड में कभी न रखें, पर्यावरण चर या सुरक्षित स्टोरेज का उपयोग करें
- साइनिंग एल्गोरिदम — प्रोडक्शन के लिए HS256 के बजाय RS256 (असममित एन्क्रिप्शन) का उपयोग करें
- Claims सत्यापन — हमेशा
exp,iss,audकी जांच करें