رموز JWT في Swift: العمل مع JSON Web Token على iOS/macOS

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

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

ابدأ الدورة

رموز JWT في Swift (iOS/macOS): دليل شامل

\n\n

JSON Web Token (JWT) هو معيار مفتوح (RFC 7519) لإنشاء رموز الوصول المعتمدة على JSON. يُستخدم JWT على نطاق واسع للمصادقة وتبادل المعلومات بين العميل والخادم. في نظام Apple البيئي (iOS، macOS، watchOS، tvOS)، يصبح العمل مع JWT أمرًا بالغ الأهمية عند تطوير التطبيقات التي تتفاعل مع REST API أو الخدمات المصغرة أو أي أنظمة تتطلب نقل بيانات آمن.

\n\n

هذه المقالة مخصصة لمكتبة SwiftJWT - الحل الأكثر شيوعًا والنشط للعمل مع JWT بلغة Swift. سنناقش التثبيت، العمليات الأساسية (الإنشاء، التوقيع، التحقق) وسيناريوهات الاستخدام المتقدمة.

\n\n

ما هي SwiftJWT؟

\n\n

SwiftJWT هي مكتبة خفيفة الوزن وأصلية للغة Swift، تتيح لك:

\n
    \n
  • إنشاء JWT مع claims (ادعاءات) مخصصة
  • \n
  • توقيع الرموز باستخدام الخوارزميات: HS256، HS384، HS512 (متناظرة) و RS256، RS384، RS512 (غير متناظرة، تعتمد على RSA)
  • \n
  • التحقق من التوقيع وصلاحية الرمز
  • \n
  • فك تشفير الحمولة (payload) دون التحقق من التوقيع (مثل عرض المعلومات على العميل)
  • \n
  • العمل مع بيانات مخصصة وحقول قياسية (iss، sub، exp، iat وغيرها)
  • \n
\n\n

المكتبة مكتوبة بالكامل بلغة Swift، ولا تتطلب تبعيات خارجية (باستثناء Foundation و Security) ومتوافقة مع Swift Package Manager (SPM) و CocoaPods و Carthage.

\n\n

التثبيت عبر Swift Package Manager

\n\n

أضف الحزمة إلى مشروعك عبر Xcode أو مباشرة في Package.swift:

\n\n
// 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\n

1. إنشاء وتوقيع الرمز (HS256)

\n\n

أبسط حالة هي إنشاء رمز باستخدام مفتاح متناظر:

\n\n
import 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\n

2. التحقق من الرمز وفك تشفيره

\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\n

3. العمل مع المفاتيح غير المتناظرة (RS256)

\n\n

لبيئات الإنتاج، يُوصى باستخدام التشفير غير المتناظر (RSA). يقوم الخادم بتوقيع الرمز بمفتاح خاص، بينما يتحقق العميل باستخدام المفتاح العام:

\n\n
//                    

توصيات