رموز JWT في Rust: مكتبة jsonwebtoken
JSON Web Tokens (JWT) هي معيار مفتوح (RFC 7519) لإنشاء رموز وصول تعتمد على JSON. في نظام Rust البيئي، واحدة من أشهر وأكثر المكتبات استقرارًا للعمل مع JWT هي jsonwebtoken. توفر مجموعة كاملة من الوظائف لإنشاء وتوقيع والتحقق وفك تشفير رموز JWT، مع دعم كل من خوارزميات التشفير المتماثلة (HS256, HS384, HS512) وغير المتماثلة (RS256, RS384, RS512, ES256, ES384).
التثبيت والإعداد
لبدء العمل، أضف التبعية إلى ملف Cargo.toml لمشروعك:
[dependencies]jsonwebtoken = "9.3"serde = { version = "1.0", features = ["derive"] }chrono = "0.4"مكتبة serde ضرورية لتسلسل وإلغاء تسلسل بيانات الرمز، بينما chrono تسهل العمل مع الطوابع الزمنية (exp, iat, nbf).
الهيكل الأساسي لـ JWT
يتكون رمز JWT من ثلاثة أجزاء: الرأس (header)، والحمولة (claims)، والتوقيع. في Rust، يتم تنفيذ ذلك من خلال الهياكل:
use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]struct Claims { sub: String, // الموضوع (عادةً معرف المستخدم) exp: usize, // وقت الانتهاء (طابع زمني unix) iat: usize, // وقت الإنشاء (طابع زمني unix) role: String, // حقل مخصص}إنشاء وتوقيع رمز JWT
لنلقِ نظرة على مثال كامل لإنشاء رمز باستخدام خوارزمية HS256 (تشفير متماثل):
use jsonwebtoken::{encode, Header, EncodingKey};use chrono::Utc;
fn create_jwt(user_id: &str, secret: &str) -> Result { let now = Utc::now().timestamp() as usize; let claims = Claims { sub: user_id.to_string(), exp: now + 3600, // الرمز صالح لمدة ساعة واحدة iat: now, role: "user".to_string(), };
let token = encode( &Header::default(), // افتراضيًا HS256 &claims, &EncodingKey::from_secret(secret.as_bytes()), )?; Ok(token)} التحقق وفك تشفير الرمز
للتحقق من صحة الرمز، تُستخدم الدالة decode مع تحديد الخوارزمية والمفتاح السري:
use jsonwebtoken::{decode, DecodingKey, Validation, Algorithm};
fn verify_jwt(token: &str, secret: &str) -> Result { let validation = Validation::new(Algorithm::HS256); let token_data = decode::( token, &DecodingKey::from_secret(secret.as_bytes()), &validation, )?; Ok(token_data.claims)} العمل مع الخوارزميات غير المتماثلة (RS256)
لبيئات الإنتاج، يُوصى باستخدام التشفير غير المتماثل. مثال مع RS256:
use jsonwebtoken::{encode, decode, Header, EncodingKey, DecodingKey, Validation, Algorithm};
// إنشاء رمز باستخدام المفتاح الخاصfn create_rs256_token(user_id: &str, private_key_pem: &str) -> Result> { let claims = Claims { sub: user_id.to_string(), exp: (Utc::now().timestamp() + 3600) as usize, iat: Utc::now().timestamp() as usize, role: "admin".to_string(), };
let token = encode( &Header::new(Algorithm::RS256), &claims, &EncodingKey::from_rsa_pem(private_key_pem.as_bytes())?, )?; Ok(token)}
// التحقق باستخدام المفتاح العامfn verify_rs256_token(token: &str, public_key_pem: &str) -> Result> { let mut validation = Validation::new(Algorithm::RS256); validation.validate_exp = true; // التحقق من تاريخ الصلاحية
let token_data = decode::( token, &DecodingKey::from_rsa_pem(public_key_pem.as_bytes())?, &validat