رموز JWT في Rust: المكتبات وتنفيذ المصادقة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

رموز JWT في Rust: المكتبات وتنفيذ المصادقة

\n

JSON 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
\n

في هذه المقالة، سنركز على jsonwebtoken باعتبارها الحل الأكثر نضجًا وتوثيقًا.

\n\n

التثبيت والإعداد

\n

أضف التبعية إلى Cargo.toml:

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

إنشاء رموز JWT والتحقق منها

\n

لننظر إلى مثال كامل لتنفيذ المصادقة باستخدام 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,        // معرف المستخدم\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\n
use 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

توصيات