مقدمة إلى 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 يبدو كالتالي:
- يفتح التطبيق عرض ويب (SFSafariViewController أو ASWebAuthenticationSession) لمصادقة المستخدم.
- بعد تسجيل الدخول بنجاح، يعيد الخادم التوجيه إلى callback URL مع رمز مؤقت.
- يستبدل التطبيق الرمز بـ access token و refresh token.
- يُستخدم 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
```