ما هو OAuth 2.0 و JWT ولماذا هما مهمان في Kotlin؟
\n\nفي تطوير الويب الحديث، أمان البيانات وإدارة الوصول من المهام الأساسية. إذا كنت تكتب تطبيق خادم بلغة Kotlin، فستواجه عاجلاً أم آجلاً الحاجة إلى حماية API أو تنظيم تسجيل الدخول عبر خدمات خارجية (Google, GitHub, VK). لهذا الغرض، يوجد معياران — OAuth 2.0 (بروتوكول التفويض) و JWT (JSON Web Token — تنسيق الرمز المميز).
\n\nفي هذه المقالة، سنشرح كيفية عمل OAuth 2.0 و JWT، وسننفذ تفويضاً بسيطاً بلغة Kotlin باستخدام المكتبات الشائعة. المحتوى موجه للمبتدئين، لذلك سيتم شرح جميع المصطلحات المعقدة بلغة بسيطة.
\n\nالمفاهيم الأساسية: OAuth 2.0 و JWT
\n\nما هو OAuth 2.0؟
\nOAuth 2.0 هو بروتوكول يسمح لخدمة واحدة (مثل تطبيقك) بالحصول على وصول محدود إلى موارد المستخدم في خدمة أخرى (مثل ملفه الشخصي في Google) دون نقل اسم المستخدم وكلمة المرور. تخيل أنك تريد تسجيل الدخول إلى موقع عبر حساب Google — هذا هو OAuth 2.0.
\n\nالأطراف الرئيسية في OAuth 2.0:
\n- \n
- Resource Owner — المستخدم، مالك البيانات. \n
- Client — تطبيقك الذي يريد الحصول على الوصول. \n
- Authorization Server — الخادم الذي يصدر الإذن (مثل Google). \n
- Resource Server — الخادم الذي يخزن بيانات المستخدم (مثل API Google). \n
ما هو JWT؟
\nJWT هو تنسيق رمز مميز مضغوط ومكتفي بذاته يحتوي على معلومات عن المستخدم (مثل المعرف، الدور، تاريخ الصلاحية). يتم توقيع الرمز بتوقيع رقمي، لذلك لا يمكن تزويره. يتكون JWT من ثلاثة أجزاء مفصولة بنقاط:
\n\nheader.payload.signature\n\nمثال على JWT مفكوك الترميز:
\n{\n "sub": "1234567890",\n "name": "إيفان بيتروف",\n "iat": 1516239022,\n "exp": 1516242622\n}\n\nالميزة الرئيسية لـ JWT هي أن الخادم لا يحتاج إلى تخزين الجلسات في قاعدة البيانات. جميع المعلومات موجودة داخل الرمز المميز.
\n\nتنفيذ JWT في Kotlin باستخدام Spring Boot
\n\nلننظر إلى مثال عملي. سننشئ REST API بلغة Kotlin باستخدام Spring Boot و Spring Security. سيقوم تطبيقنا بإصدار رمز JWT عند المصادقة الناجحة.
\n\nالخطوة 1. إضافة التبعيات
\nأضف التبعيات التالية إلى build.gradle.kts:
dependencies {\n implementation("org.springframework.boot:spring-boot-starter-security")\n implementation("org.springframework.boot:spring-boot-starter-web")\n implementation("io.jsonwebtoken:jjwt-api:0.12.5")\n runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5")\n runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.5")\n}\n\nالخطوة 2. إنشاء خدمة JWT
\nلننشئ كلاس JwtService الذي سيقوم بتوليد الرموز والتحقق منها:
import io.jsonwebtoken.Claims\nimport io.jsonwebtoken.Jwts\nimport io.jsonwebtoken.security.Keys\nimport org.springframework.stereotype.Service\nimport java.util.*\n\n@Service\nclass JwtService {\n private val secretKey = "mySecretKeyForJwtToken12345678901234567890" // 32 حرفاً على الأقل\n private val expirationMs = 3600000L // ساعة واحدة\n\n fun generateToken(username: String): String {\n val claims: Map = mapOf(\n "sub" to username,\n "iat" to Date(),\n "exp" to Date(System.currentTimeMillis() + expirationMs)\n )\n return Jwts.builder()\n .claims(claims)\n .signWith(Keys.hmacShaKeyFor(secretKey.toByteArray()))\n .compact()\n }\n\n fun extractUsername(token: String): String? {\n return try {\n val claims = parseToken(token)\n claims.subject\n } catch (e: Exception) {\n nul