OAuth 2.0 و JWT في Kotlin: دليل شامل للمبتدئين

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

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

ابدأ الدورة

ما هو 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؟

\n

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

ما هو JWT؟

\n

JWT هو تنسيق رمز مميز مضغوط ومكتفي بذاته يحتوي على معلومات عن المستخدم (مثل المعرف، الدور، تاريخ الصلاحية). يتم توقيع الرمز بتوقيع رقمي، لذلك لا يمكن تزويره. يتكون JWT من ثلاثة أجزاء مفصولة بنقاط:

\n\n
header.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:

\n\n
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 الذي سيقوم بتوليد الرموز والتحقق منها:

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

المدونات

توصيات الكتب