رموز JWT في Rust: المكتبات وتنفيذ المصادقة
\nJSON Web Token (JWT) هو معيار مفتوح لإنشاء رموز الوصول، يعتمد على تنسيق JSON. في نظام Rust البيئي، يتم تنفيذ العمل مع JWT من خلال عدة مكتبات عالية الجودة، يتصدرها jsonwebtoken. توفر هذه الأداة دورة كاملة للعمل مع الرموز: الإنشاء، التوقيع، التحقق، وفك الترميز.
\n\nالمكتبات الرئيسية لـ JWT في Rust
\nحاليًا، أشهر الكريتات (crates) للعمل مع JWT هي:
\n- \n
- jsonwebtoken — المكتبة الرئيسية مع دعم خوارزميات HS256 و RS256 و EdDSA \n
- jwt — بديل أخف مع وظائف أساسية \n
- biscuit — مكتبة متقدمة تدعم السيناريوهات المعقدة \n
في هذه المقالة، سنركز على jsonwebtoken باعتبارها الحل الأكثر نضجًا وتوثيقًا.
التثبيت والإعداد
\nأضف التبعية إلى Cargo.toml:
[dependencies]\njsonwebtoken = "9.3"\nserde = { version = "1.0", features = ["derive"] }\nchrono = "0.4"\n\nإنشاء رموز JWT والتحقق منها
\nلننظر إلى مثال كامل لتنفيذ المصادقة باستخدام 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, // معرف المستخدم\n exp: usize, // وقت انتهاء صلاحية الرمز\n iat: usize, // وقت إنشاء الرمز\n role: String, // دور المستخدم\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الاستخدام العملي في تطبيق ويب
\nيتطلب دمج JWT مع أطر الويب (مثل Actix-web أو Axum) إنشاء middleware للتحقق من الرموز:
\n\nuse actix_web::{HttpRequest, HttpResponse, web, App, HttpServer, middleware::from_fn};\nuse std::sync::Arc;\n\n// Middleware للتحقق من 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("Missing token"))?;\n \n let token = auth_header\n .strip_prefix("Bearer ")\n .ok_or(HttpResponse::Unauthorized().json("Invalid token format"))?;\n \n verify_token(token, SECRET)\n .map_err(|_| HttpResponse::Unauthorized().json("Invalid token"))\n}\n\n// نقطة نهاية محمية\nasync fn protected_endpoint(claims: Claims) -> HttpResponse {\n HttpResponse::Ok().json(claims)\n} \n\nالإمكانيات المتقدمة وأفضل الممارسات
\n- \n
- رموز التحديث (Refresh tokens) — استخدم رموز وصول قصيرة العمر (15-30 دقيقة) ورموز تحديث طويلة العمر (7-30 يومًا) \n
- تخزين الأسرار — لا تخزن المفاتيح السرية في الكود أبدًا، استخدم متغيرات البيئة أو مخزن آمن \n
- خوارزميات التوقيع — للإنتاج، استخدم RS256 (تشفير غير متماثل) بدلاً من HS256 \n
- Va