OAuth 2.0 و JWT التفويض على Rust: دليل كامل

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

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

ابدأ الدورة

مقدمة في OAuth 2.0 و JWT باستخدام Rust



تتطلب تطبيقات الويب الحديثة مصادقة موثوقة وآمنة. هناك معياران رئيسيان في هذا المجال — OAuth 2.0 (بروتوكول التفويض) و JWT (JSON Web Token، تنسيق رمز الوصول). Rust، بفضل أدائها وأمان الذاكرة، أصبحت خيارًا ممتازًا لبناء API حيث تكون السرعة والموثوقية أمرًا بالغ الأهمية.



في هذه المقالة، سنشرح كيفية تنفيذ مصادقة OAuth 2.0 و JWT باستخدام Rust مع استخدام الكريتات الشائعة. ستتعلم كيفية إعداد الخادم، وإصدار والتحقق من JWT-توكنز، بالإضافة إلى دمج تدفق OAuth 2.0. المادة موجهة للمطورين الملمين بأساسيات Rust وأطر العمل الويب.



المفاهيم الأساسية لـ OAuth 2.0 و JWT



ما هو OAuth 2.0؟

OAuth 2.0 هو بروتوكول وصول مفوض. يسمح للتطبيق بالحصول على وصول محدود إلى موارد المستخدم دون نقل بيانات اعتماده (اسم المستخدم وكلمة المرور). المشاركون الرئيسيون:

  • Resource Owner — المستخدم المالك للبيانات.
  • Client — تطبيقنا (مثل خدمة ويب على Rust).
  • Authorization Server — الخادم الذي يصدر الرموز بعد المصادقة الناجحة.
  • Resource Server — API الذي يوفر البيانات المحمية.


ما هو JWT؟

JWT هو تنسيق رمز مضغوط وآمن لعناوين URL، يتكون من ثلاثة أجزاء: الرأس (header)، والحمولة (payload)، والتوقيع (signature). يضمن التوقيع سلامة البيانات. غالبًا ما يُستخدم JWT كرمز وصول (access token) في OAuth 2.0، لأنه مكتفي ذاتيًا: يمكن للخادم التحقق منه دون الرجوع إلى قاعدة البيانات.



التنفيذ العملي باستخدام Rust

للتنفيذ، سنحتاج إلى الكريتات التالية:

  • actix-web — إطار عمل ويب.
  • serde و serde_json — للتسلسل/إلغاء التسلسل.
  • jsonwebtoken — للعمل مع JWT.
  • dotenv — لإدارة التكوين.
  • chrono — للعمل مع التواريخ والوقت.


الخطوة 1: إعداد المشروع والهيكل

أنشئ مشروع Cargo جديد وأضف التبعيات في Cargo.toml:

[dependencies]actix-web = "4"actix-rt = "2"serde = { version = "1", features = ["derive"] }serde_json = "1"jsonwebtoken = "9"dotenv = "0.15"chrono = { version = "0.4", features = ["serde"] }uuid = { version = "1", features = ["v4"] }


أنشئ ملف .env لتخزين المفتاح السري:

JWT_SECRET=my_super_secret_key_12345


الخطوة 2: إنشاء نموذج البيانات ووظائف JWT

سنحدد الهياكل الخاصة بـ JWT وننفذ وظائف إنشاء الرموز والتحقق منها.

use chrono::{Utc, Duration};use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};use serde::{Deserialize, Serialize};use std::env;

#[derive(Debug, Serialize, Deserialize)]pub struct Claims { pub sub: String, // معرف المستخدم pub exp: usize, // وقت الانتهاء (timestamp) pub iat: usize, // وقت الإصدار (timestamp)}

pub fn create_jwt(user_id: &str) -> Result<String, jsonwebtoken::errors::Error> { let secret = env::var("JWT_SECRET").expect("JWT_SECRET must be set"); let now = Utc::now(); let expiration = now + Duration::hours(24); // الرمز صالح لمدة 24 ساعة

let claims = Claims { sub: user_id.to_owned(), exp: expiration.timestamp() as usize, iat: now.timestamp() as usize, };

let token = encode( &Header::default(), &claims, &EncodingKey::from_secret(secret.as_bytes()), )?; Ok(token)}

pub fn validate_jwt(token: &str) -> Result<Claims, jsonwebtoken

المدونات

توصيات الكتب