رموز JWT في Swift (iOS/macOS): دليل شامل
\n\nJSON Web Token (JWT) هو معيار مفتوح (RFC 7519) لإنشاء رموز الوصول المعتمدة على JSON. يُستخدم JWT على نطاق واسع للمصادقة وتبادل المعلومات بين العميل والخادم. في نظام Apple البيئي (iOS، macOS، watchOS، tvOS)، يصبح العمل مع JWT أمرًا بالغ الأهمية عند تطوير التطبيقات التي تتفاعل مع REST API أو الخدمات المصغرة أو أي أنظمة تتطلب نقل بيانات آمن.
\n\nهذه المقالة مخصصة لمكتبة SwiftJWT - الحل الأكثر شيوعًا والنشط للعمل مع JWT بلغة Swift. سنناقش التثبيت، العمليات الأساسية (الإنشاء، التوقيع، التحقق) وسيناريوهات الاستخدام المتقدمة.
\n\nما هي SwiftJWT؟
\n\nSwiftJWT هي مكتبة خفيفة الوزن وأصلية للغة Swift، تتيح لك:
\n- \n
- إنشاء JWT مع claims (ادعاءات) مخصصة \n
- توقيع الرموز باستخدام الخوارزميات: HS256، HS384، HS512 (متناظرة) و RS256، RS384، RS512 (غير متناظرة، تعتمد على RSA) \n
- التحقق من التوقيع وصلاحية الرمز \n
- فك تشفير الحمولة (payload) دون التحقق من التوقيع (مثل عرض المعلومات على العميل) \n
- العمل مع بيانات مخصصة وحقول قياسية (iss، sub، exp، iat وغيرها) \n
المكتبة مكتوبة بالكامل بلغة Swift، ولا تتطلب تبعيات خارجية (باستثناء Foundation و Security) ومتوافقة مع Swift Package Manager (SPM) و CocoaPods و Carthage.
\n\nالتثبيت عبر Swift Package Manager
\n\nأضف الحزمة إلى مشروعك عبر Xcode أو مباشرة في Package.swift:
// Package.swift\ndependencies: [\n .package(url: "https://github.com/Kitura/Swift-JWT.git", from: "4.0.0")\n],\ntargets: [\n .target(name: "YourTarget", dependencies: ["SwiftJWT"])\n]\n\n\nالعمليات الأساسية مع JWT
\n\n1. إنشاء وتوقيع الرمز (HS256)
\n\nأبسط حالة هي إنشاء رمز باستخدام مفتاح متناظر:
\n\nimport SwiftJWT\n\n// 1. تعريف هيكل Claims (الادعاءات)\nstruct MyClaims: Claims {\n let iss: String\n let sub: String\n let exp: Date\n let admin: Bool\n let customData: String\n}\n\n// 2. إنشاء مثيل من Claims\nlet claims = MyClaims(\n iss: "com.yourcompany.app",\n sub: "user123",\n exp: Date(timeIntervalSinceNow: 3600), // +1 ساعة\n admin: true,\n customData: "some_value"\n)\n\n// 3. تعريف المفتاح (لـ HS256 - أي سلسلة نصية)\nlet secretKey = "your-256-bit-secret".data(using: .utf8)!\n\n// 4. إنشاء JWT\nvar jwt = JWT(claims: claims)\nlet signedJWT = try jwt.sign(using: .hs256(key: secretKey))\nprint("الرمز المُنشأ:\\n\\(signedJWT)")\n\n\n2. التحقق من الرمز وفك تشفيره
\n\n// التحقق مع فحص التوقيع وصلاحية الرمز\nlet receivedToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."\n\ndo {\n // التحقق وفك التشفير\n let verifiedJWT = try JWT<MyClaims>.verify(token: receivedToken, using: .hs256(key: secretKey))\n print("الرمز صالح. Claims: \\(verifiedJWT.claims)")\n \n // فحص حقول محددة\n if verifiedJWT.claims.admin {\n print("المستخدم هو مسؤول")\n }\n} catch {\n print("خطأ في التحقق: \\(error)")\n // الأخطاء المحتملة: expiredToken، invalidSignature، malformedToken\n}\n\n// فك التشفير دون التحقق (لقراءة البيانات فقط)\nif let payload = try? JWTDecoder().decodePayload(from: receivedToken) {\n print("الحمولة (بدون تحقق): \\(payload)")\n}\n\n\n3. العمل مع المفاتيح غير المتناظرة (RS256)
\n\nلبيئات الإنتاج، يُوصى باستخدام التشفير غير المتناظر (RSA). يقوم الخادم بتوقيع الرمز بمفتاح خاص، بينما يتحقق العميل باستخدام المفتاح العام:
\n\n//