0Pricing
Kotlin Academy · درس

إضافات المصادقة: JWT وSession

أمّن مسارات Ktor باستخدام رموز JWT المميّزة ومصادقة الجلسات.

إضافات المصادقة: JWT وSession درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

نظرة عامة على Ktor Authentication

توفّر إضافة Authentication في Ktor واجهة API موحّدة لحماية المسارات. يمكنك إعداد موفّر واحد أو أكثر (JWT وSession وBasic وOAuth وغيرها)، ثم تغليف المسارات داخل كتلة authenticate("providerName") { }.

إضافة تبعيات المصادقة

أضف مكتبات المصادقة وJWT إلى بنية مشروعك:

dependencies {
    implementation("io.ktor:ktor-server-auth:2.3.12")
    implementation("io.ktor:ktor-server-auth-jwt:2.3.12")
    implementation("io.ktor:ktor-server-sessions:2.3.12")
}

إعداد مصادقة JWT

ثبّت إضافة Authentication واضبط موفّر JWT. يتحقق verifier من توقيع الرمز المميز، بينما تستخرج validate هوية المستخدم من الحمولة:

install(Authentication) {
    jwt("auth-jwt") {
        realm = "ktor app"
        verifier(
            JWT.require(Algorithm.HMAC256(secret))
                .withAudience(audience)
                .withIssuer(issuer)
                .build()
        )
        validate { credential ->
            if (credential.payload.getClaim("username").asString() != null)
                JWTPrincipal(credential.payload)
            else null
        }
    }
}

حماية المسارات باستخدام JWT

غلّف أي مجموعة من المسارات داخل authenticate("auth-jwt") { }. وستتلقى الطلبات غير المصادق عليها استجابة 401 تلقائيًا:

routing {
    authenticate("auth-jwt") {
        get("/protected") {
            val principal = call.principal<JWTPrincipal>()!!
            val username = principal.payload.getClaim("username").asString()
            call.respondText("Hello, $username")
        }
    }
}

إصدار رمز JWT

أنشئ رمز JWT ووقّعه في نقطة نهاية تسجيل الدخول باستخدام مكتبة java-jwt:

post("/login") {
    val user = call.receive<LoginRequest>()
    // validate credentials ...
    val token = JWT.create()
        .withAudience(audience)
        .withIssuer(issuer)
        .withClaim("username", user.username)
        .withExpiresAt(Date(System.currentTimeMillis() + 3_600_000))
        .sign(Algorithm.HMAC256(secret))
    call.respond(mapOf("token" to token))
}

مصادقة الجلسات

تخزّن الجلسات حالة المستخدم على الخادم (أو على العميل في صورة ملفات تعريف ارتباط موقّعة). ثبّت إضافة Sessions وعرّف فئة بيانات للجلسة:

data class UserSession(val userId: Long, val username: String)

install(Sessions) {
    cookie<UserSession>("user_session") {
        cookie.path = "/"
        cookie.httpOnly = true
    }
}

إعداد موفّر مصادقة الجلسات

أنشئ موفّر مصادقة للجلسة يقرأ بيانات الجلسة ويعيد هوية المستخدم:

install(Authentication) {
    session<UserSession>("auth-session") {
        validate { session -> session }
        challenge { call.respond(HttpStatusCode.Unauthorized) }
    }
}

تعيين الجلسات ومسحها

عيّن جلسة بعد تسجيل الدخول باستخدام call.sessions.set() وامسحها عند تسجيل الخروج باستخدام call.sessions.clear():

post("/login") {
    val creds = call.receive<LoginRequest>()
    // validate ...
    call.sessions.set(UserSession(userId = 1L, username = creds.username))
    call.respond(HttpStatusCode.OK)
}

post("/logout") {
    call.sessions.clear<UserSession>()
    call.respond(HttpStatusCode.OK)
}

JWT مقابل الجلسات: متى تستخدم كلًّا منهما

JWT: عديم الحالة، ومناسب لواجهات API التي تستهلكها تطبيقات الأجهزة المحمولة أو عملاء SPA. يحمل الرمز جميع المطالبات، ولا يحتاج الخادم إلى مخزن جلسات. الجلسات: معتمدة على الحالة، ومناسبة لتطبيقات الويب التي يعرضها الخادم. يُخزَّن معرّف الجلسة في ملف تعريف ارتباط، بينما يحتفظ الخادم بالبيانات (في الذاكرة أو Redis أو قاعدة بيانات).

دمج موفّري مصادقة متعددين

يمكنك تعريف موفّرين متعددين واشتراط استخدام أيٍّ منهم عبر authenticate("jwt", "session") { }. يجرّب Ktor الموفّرين بالترتيب ويقبل الطلب إذا تحقّق أيّ موفّر منهم بنجاح.

استجابات challenge مخصصة

يحتوي كل موفّر على كتلة challenge تحدّد الإجراء الذي يجب اتخاذه عند فشل المصادقة. أعد استجابة 401 تحتوي على نص خطأ بتنسيق JSON بدلًا من ترويسة WWW-Authenticate الافتراضية:

jwt("auth-jwt") {
    // ...
    challenge { _, _ ->
        call.respond(HttpStatusCode.Unauthorized, mapOf("error" to "Token expired or invalid"))
    }
}

تحقق سريع

ماذا تفعل كتلة validate في موفّر JWT في Ktor؟

مراجعة: إضافات المصادقة — JWT والجلسات

أهم النقاط:

  • ثبّت Authentication واضبط الموفّرين (jwt وsession وbasic وoauth)
  • احمِ المسارات باستخدام authenticate("providerName") { }
  • JWT: رموز عديمة الحالة؛ وقّعها عند تسجيل الدخول، وتحقق منها باستخدام verifier، واقرأ المطالبات في validate
  • الجلسات: معتمدة على الحالة؛ استخدم call.sessions.set() عند تسجيل الدخول وclear() عند تسجيل الخروج
  • استخدم challenge لتخصيص تنسيق استجابة 401

الأسئلة الشائعة

هل درس «إضافات المصادقة: JWT وSession» مجاني؟

نعم — نص درس «إضافات المصادقة: JWT وSession» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «إضافات المصادقة: JWT وSession»؟

أمّن مسارات Ktor باستخدام رموز JWT المميّزة ومصادقة الجلسات. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «إضافات المصادقة: JWT وSession»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد مشروع Ktor: ‏embeddedServer ووحدات Application
  2. التوجيه والمعاملات ذات الأنواع
  3. تفاوض المحتوى وkotlinx.serialization
  4. إضافات المصادقة: JWT وSession
← العودة إلى Kotlin Academy