OAuth 2.0 وتفويض JWT في Swift: دليل شامل للمبتدئين

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

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

ابدأ الدورة

مقدمة: لماذا نحتاج إلى التفويض في التطبيقات المحمولة؟

نادرًا ما تعمل تطبيقات iOS الحديثة بشكل منعزل. فهي تتواصل مع الخوادم، وترسل البيانات، وتستقبل محتوى مخصصًا. ولكن كيف يمكن للخادم أن يعرف أن الطلب قد أُرسل بالفعل من قبل المستخدم الذي يدّعي هويته؟ هنا تأتي OAuth 2.0 و JWT (JSON Web Token) للإنقاذ. هذه ليست مجرد اختصارات عصرية، بل هي معايير أمان تشكل أساس عمل معظم واجهات API الحديثة (Google, Facebook, GitHub, الخادم الخلفي الخاص بك).

في هذه المقالة، سنشرح كيفية عمل OAuth 2.0 و JWT في Swift. ستتعرف على الفروق بينهما، وكيفية تنفيذها بشكل صحيح، وما هي العقبات التي تنتظر المبتدئ. سنكتب كودًا للحصول على الرموز وتخزينها وتحديثها. هيا بنا!



1. الأساسيات: OAuth 2.0 و JWT — ما الفرق؟

يخلط الكثيرون بين هذين المفهومين. في الواقع، هما مستويان مختلفان من التجريد.

  • OAuth 2.0 — هو بروتوكول تفويض. يصف كيف يمكن للتطبيق (العميل) الحصول على وصول إلى موارد المستخدم على خادم طرف ثالث (مثل صوره في Google) دون نقل اسم المستخدم وكلمة المرور. الفكرة الرئيسية هي إصدار رموز وصول مؤقتة.
  • JWT — هو تنسيق رمز. وهو سلسلة نصية مضغوطة وآمنة لعناوين URL تحتوي على بيانات JSON (مثل معرف المستخدم، الدور، تاريخ الانتهاء) وتوقيعًا. غالبًا ما يُستخدم JWT كرمز وصول (access token) في OAuth 2.0، ولكن يمكن استخدامه أيضًا بشكل منفصل.

تشبيه بسيط: OAuth 2.0 هو قواعد إصدار تصريح الدخول إلى الملعب، بينما JWT هو التصريح البلاستيكي نفسه الذي يحمل صورتك وختمك.

في سيناريو نموذجي لتطبيق iOS:

  1. يفتح المتصفح لتسجيل الدخول عبر مزود OAuth (Google, Apple ID, الخادم الخاص بك).
  2. يحصل على رمز التفويض (authorization code).
  3. يستبدل الرمز بـ رمز الوصول (access token) (غالبًا بتنسيق JWT) و رمز التحديث (refresh token).
  4. يستخدم رمز الوصول للطلبات إلى API.
  5. عند انتهاء صلاحية رمز الوصول، يستخدم رمز التحديث للحصول على رمز جديد.


2. هيكل رمز JWT

يتكون JWT من ثلاثة أجزاء مفصولة بنقاط:

header.payload.signature

مثال على JWT مفكوك الترميز:

// Header (الرأس){  "alg": "HS256",  "typ": "JWT"}// Payload (الحمولة){  "sub": "1234567890",  "name": "إيفان بيتروف",  "iat": 1516239022,  "exp": 1516242622}// Signature (التوقيع) - يتم إنشاؤه بواسطة الخادم

هام: حمولة JWT غير مشفرة، بل هي مشفرة فقط بـ Base64. يمكن لأي شخص قراءتها. السرية مضمونة بواسطة التوقيع — إذا رأى الخادم أن التوقيع غير متطابق، فإنه يرفض الرمز. لذلك، لا تقم أبدًا بتخزين كلمات المرور أو البيانات السرية في JWT.



3. تنفيذ OAuth 2.0 و JWT في Swift

الآن ننتقل إلى التطبيق العملي. سنكتب فئة للعمل مع التفويض. للتبسيط، سنستخدم URLSession المدمج، على الرغم من أنه في المشاريع الحقيقية غالبًا ما يُستخدم Alamofire أو SwiftUI + async/await.



3.1. نماذج البيانات

struct AuthResponse: Codable {    let accessToken: String    let refreshToken: String?    let expiresIn: Int        enum CodingKeys: String, CodingKey {        case accessToken = "access_token"        case refreshToken = "refresh_token"        case expiresIn = "expires_in"    }}

struct UserProfile: Codable { let id: String let name: String let email: String}


3.2. خدمة التفويض

سننشئ فئة AuthService التي ستكون مسؤولة عن الحصول على الرموز وتحديثها. يرجى ملاحظة: في التطبيق الحقيقي، يجب تخزين URL و clientSecret بشكل آمن (على سبيل المثال، في Keychain أو عبر خادم التكوين).

class AuthService {    static let shared = A                

المدونات

توصيات الكتب