رموز JWT في Swift (iOS/macOS): دليل شامل
JSON Web Token (JWT) هي طريقة مضغوطة وآمنة لعناوين URL لنقل البيانات بين الأطراف بتنسيق JSON. في نظام Apple البيئي (iOS، macOS، watchOS، tvOS)، تُستخدم JWT على نطاق واسع لمصادقة المستخدمين وتبادل المعلومات بين الخدمات وتنفيذ الدخول الموحد (Single Sign-On). في هذه المقالة، سنشرح كيفية العمل مع رموز JWT في Swift، وما هي المكتبات التي يجب استخدامها وكيفية تنفيذ الدورة الكاملة: من الإنشاء إلى التحقق.
ما هو JWT ولماذا هو مطلوب في iOS/macOS؟
يتكون JWT من ثلاثة أجزاء مفصولة بنقاط:
- Header — الرأس، يحتوي على نوع الرمز وخوارزمية التوقيع (مثل HS256 أو RS256).
- Payload — الحمولة مع البيانات (claims)، مثل معرف المستخدم وتاريخ انتهاء الصلاحية (exp) والمُصدر (iss) وغيرها.
- Signature — التوقيع، الذي يتم إنشاؤه بناءً على الرأس والحمولة والمفتاح السري (أو زوج المفاتيح للخوارزمية غير المتماثلة).
في تطبيقات الهواتف المحمولة، يُستخدم JWT عادةً من أجل:
- تخزين جلسة المستخدم بعد تسجيل الدخول.
- نقل صلاحيات الوصول بين العميل والخادم.
- تبادل البيانات بشكل آمن بين الخدمات المصغرة.
المكتبات الشائعة للعمل مع JWT في Swift
هناك العديد من المكتبات الموثوقة التي تُبسّط العمل مع JWT على منصات Apple:
- Swift-JWT (IBM) — واحدة من الأكثر شيوعًا، تدعم HS256 وRS256 وES256 وخوارزميات أخرى، وتعمل على iOS وmacOS وLinux.
- JWTDecode (Auth0) — مكتبة خفيفة فقط لفك التشفير والتحقق من التوقيع (بدون إنشاء الرموز).
- Vapor JWT — للجانب الخادم بلغة Swift (Vapor)، ولكن يمكن استخدامه أيضًا في مشاريع العميل.
- Kitura-CredentialsJWT — جزء من نظام Kitura البيئي من IBM.
في هذه المقالة، سنركز على مكتبة Swift-JWT لأنها الأكثر تنوعًا وتُدعم بنشاط.
تثبيت Swift-JWT عبر Swift Package Manager (SPM)
أضف التبعية إلى ملف Package.swift أو عبر Xcode:
// Package.swiftdependencies: [ .package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")],targets: [ .target(name: "YourTarget", dependencies: ["SwiftJWT"])]أو في Xcode: File → Swift Packages → Add Package Dependency وحدد URL: https://github.com/Kitura/Swift-JWT.git.
إنشاء رمز JWT باستخدام مفتاح متماثل (HS256)
لننظر إلى مثال لإنشاء JWT باستخدام خوارزمية HS256 (مفتاح متماثل):
import SwiftJWT
// تعريف هيكل للحمولةstruct MyClaims: Claims { let sub: String let exp: Date let iss: String let admin: Bool}
// إنشاء الحمولةlet claims = MyClaims( sub: "1234567890", exp: Date(timeIntervalSinceNow: 3600), // الرمز صالح لمدة ساعة واحدة iss: "pythonlib.ru", admin: true)
// إنشاء كائن JWTvar jwt = JWT(claims: claims)
// تحديد الرأس (اختياري، الافتراضي هو HS256)let header = Header(kid: "my-key-id")jwt.header = header
// المفتاح السري (في المشروع الحقيقي، قم بتخزينه في Keychain أو .env)let privateKey = "my-secret-key".data(using: .utf8)!
// التوقيع والحصول على سلسلة الرمزdo { let signedJWT = try jwt.sign(using: .hs256(key: privateKey)) print("الرمز JWT المُنشأ:\\(signedJWT)")} catch { print("خطأ في التوقيع: \\(error)")}التحقق من JWT وفك تشفيره
للتحقق من التوقيع واستخراج البيانات من الرمز، استخدم:
let jwtString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjg5OTk5OTk5LCJpc3MiOiJweXRob25saWIucnUiLCJhZG1