المصادقة والتفويض في Rust: مراجعة شاملة للأدوات
Rust هي لغة برمجة أنظمة تُستخدم بشكل متزايد لإنشاء خدمات ويب عالية التحميل. قضايا الأمان، بما في ذلك المصادقة (التحقق من هوية المستخدم) والتفويض (التحقق من صلاحيات الوصول)، تحظى بأهمية خاصة هنا. في هذه المقالة، سنستعرض المكتبات والأساليب الرئيسية لتنفيذ هذه الآليات في نظام Rust البيئي.
الأساليب الرئيسية للمصادقة
في مشاريع Rust، تُستخدم ثلاث استراتيجيات بشكل شائع:
- المصادقة القائمة على الجلسة — يخزن الخادم حالة الجلسة (عادةً في Redis أو الذاكرة)، ويحصل العميل على ملف تعريف ارتباط (cookie) مع معرف الجلسة.
- JWT (JSON Web Token) — رموز بدون حالة (stateless) تحتوي على ادعاءات (claims) ويتم توقيعها من قبل الخادم.
- OAuth2 / OpenID Connect — مصادقة لا مركزية عبر مزودين خارجيين (Google، GitHub، Yandex).
مكتبات Rust الرئيسية
1. jsonwebtoken — العمل مع JWT
المكتبة الأكثر شيوعًا لإنشاء والتحقق من رموز JWT. تدعم HS256، RS256، ES256 وخوارزميات أخرى.
use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};
// إنشاء رمزlet claims = serde_json::json!({ "sub": "user123", "exp": 1740000000, "role": "admin"});let token = encode(&Header::default(), &claims, &EncodingKey::from_secret("secret".as_ref())).unwrap();
// التحققlet token_data = decode::<serde_json::Value>( &token, &DecodingKey::from_secret("secret".as_ref()), &Validation::default()).unwrap();println!("الرمز مملوك لـ: {}", token_data.claims["sub"]);2. bcrypt — تجزئة كلمات المرور
تجزئة آمنة مع ملح (salt). تُستخدم لتخزين كلمات المرور بشكل آمن في قاعدة البيانات.
use bcrypt::{hash, verify, DEFAULT_COST};
let password = "super_secret_123";let hashed = hash(password, DEFAULT_COST).unwrap();println!("التجزئة: {}", hashed);
let valid = verify(password, &hashed).unwrap();println!("كلمة المرور صحيحة: {}", valid); // true3. actix-web-identity / actix-web-flash — الجلسات لـ Actix Web
إذا كنت تستخدم إطار العمل Actix Web، فإن هذه الحزم (crates) ستساعدك في إدارة الجلسات عبر ملفات تعريف الارتباط (cookies) أو Redis.
use actix_web::{web, App, HttpServer, HttpRequest, HttpResponse, middleware::IdentityService};use actix_web::cookie::Key;
async fn login(req: HttpRequest) -> HttpResponse { let identity = req.extensions().get::<Identity>().unwrap(); identity.remember("user_id=42".to_string()); HttpResponse::Ok().body("تم المصادقة")}
#[actix_web::main]async fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new() .wrap(IdentityService::new(Key::from(&[0; 32]))) .route("/login", web::get().to(login)) }) .bind("127.0.0.1:8080")? .run() .await}4. oauth2 — عميل OAuth2
مكتبة لتنفيذ تدفق OAuth2 (على سبيل المثال، "تسجيل الدخول عبر GitHub"). تدعم رمز التفويض (Authorization Code)، بيانات اعتماد العميل (Client Credentials) ورمز التحديث (Refresh Token).
use oauth2::{basic::BasicClient, AuthUrl, TokenUrl, ClientId, ClientSecret, RedirectUrl};
let client = BasicClient::new( ClientId::new("your_client_id".to_string()), Some(ClientSecret::new("your_client_secret".to_string())), AuthUrl::new("https://github.com/login/oauth/authorize".to_string()).unwrap(), Some(TokenUrl::new("https://github.com/login/oauth/access_token".to_string()).unwrap())).set_redirect_uri(RedirectUrl::new("http://localhost:8080/callback".to_string()).unwrap());مقارنة الأساليب
- JWT — الخيار الأفضل للخدمات المصغرة وواجهات برمجة التطبيقات (API)، لا يتطلب خادم