OAuth 2.0 و JWT التفويض على Swift: دليل شامل

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

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

ابدأ الدورة
```html

مقدمة إلى OAuth 2.0 و JWT في Swift

تطبيقات Swift الحديثة للأجهزة المحمولة وسطح المكتب (iOS/macOS) تستخدم بشكل متزايد بروتوكول OAuth 2.0 وتنسيق JWT (JSON Web Token) للترخيص الآمن. يوفر OAuth 2.0 وصولاً مفوضًا إلى الموارد، بينما يسمح JWT بنقل بيانات المستخدم بشكل مضغوط وآمن. في هذه المقالة، سنشرح كيفية تنفيذ سلسلة الترخيص الكاملة في Swift: من الحصول على التوكن إلى التحقق منه وتحديثه.

سنناقش:

  • أساسيات OAuth 2.0: التدفقات (flows) والأدوار
  • هيكل JWT وفك تشفيره في Swift
  • تنفيذ عملي للترخيص باستخدام URLSession
  • تخزين التوكنات في Keychain وتحديثها

أساسيات OAuth 2.0 لمطور Swift

OAuth 2.0 هو بروتوكول ترخيص يسمح للتطبيق بالحصول على وصول محدود إلى موارد المستخدم دون نقل بيانات اعتماده. في سياق تطبيقات Swift، الأكثر استخدامًا هو Authorization Code Flow مع PKCE (Proof Key for Code Exchange) للتطبيقات المحمولة.

المكونات الرئيسية لـ OAuth 2.0

  • Resource Owner — المستخدم، مالك البيانات
  • Client — تطبيق Swift الخاص بك
  • Authorization Server — الخادم الذي يصدر التوكنات (مثل Google, Facebook, الخادم الخلفي الخاص بك)
  • Resource Server — API التي توفر البيانات المحمية

التدفق النموذجي في Swift يبدو كالتالي:

  1. يفتح التطبيق عرض ويب (SFSafariViewController أو ASWebAuthenticationSession) لمصادقة المستخدم.
  2. بعد تسجيل الدخول بنجاح، يعيد الخادم التوجيه إلى callback URL مع رمز مؤقت.
  3. يستبدل التطبيق الرمز بـ access token و refresh token.
  4. يُستخدم access token لطلبات API، بينما يُستخدم refresh token للحصول على access token جديد عند انتهاء صلاحيته.

هيكل JWT وفك تشفيره في Swift

يتكون JWT من ثلاثة أجزاء مفصولة بنقاط: header.payload.signature. مثال على JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikl2YW4gUGV0cm92IiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

فك تشفير payload في Swift (بدون التحقق من التوقيع):

import Foundation

struct JWT {
    static func decodePayload(_ token: String) -> [String: Any]? {
        let segments = token.components(separatedBy: ".")
        guard segments.count == 3 else { return nil }
        
        var base64 = segments[1]
            .replacingOccurrences(of: "-", with: "+")
            .replacingOccurrences(of: "_", with: "/")
        
        let length = Double(base64.lengthOfBytes(using: .utf8))
        let requiredLength = 4 * ceil(length / 4.0)
        let padding = Int(requiredLength - length)
        if padding > 0 {
            base64 += String(repeating: "=", count: padding)
        }
        
        guard let data = Data(base64Encoded: base64) else { return nil }
        return try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
    }
}

// الاستخدام
if let payload = JWT.decodePayload("your.jwt.token") {
    print(payload["sub"] ?? "")
    print(payload["exp"] ?? "")
}

للتحقق الكامل من توقيع JWT على جانب العميل، استخدم مكتبة SwiftJWT أو JWTDecode المتاحة عبر Swift Package Manager.

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

الخطوة 1: إعداد URLSession ونماذج التوكنات

struct AuthToken: Codable {
    let accessToken: String
    let refreshToken: String?
    let expiresIn: Int
    let tokenType: String
}

class AuthService {
    private let session = URLSession.shared
```                

المدونات

توصيات الكتب