0Pricing
Kotlin Academy · บทเรียน

ปลั๊กอินการยืนยันตัวตน: JWT และ Session

รักษาความปลอดภัยให้เส้นทาง Ktor ด้วยโทเค็น JWT bearer และการยืนยันตัวตนด้วยเซสชัน

ปลั๊กอินการยืนยันตัวตน: JWT และ Session เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมการยืนยันตัวตนใน Ktor

ปลั๊กอิน 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 เรียกใช้ โทเค็นจะมีข้อมูลกำกับทั้งหมดอยู่ภายใน จึงไม่จำเป็นต้องมีที่เก็บเซสชันบนเซิร์ฟเวอร์ Sessions: มีสถานะ เหมาะสำหรับเว็บแอปที่แสดงผลบนเซิร์ฟเวอร์ คุกกี้จะมีรหัสเซสชัน ส่วนเซิร์ฟเวอร์จะเก็บข้อมูลไว้เอง (ในหน่วยความจำ, Redis หรือฐานข้อมูล)

การรวมผู้ให้บริการยืนยันตัวตนหลายรายการ

คุณสามารถกำหนดผู้ให้บริการหลายรายการและกำหนดให้ใช้รายการใดรายการหนึ่งก็ได้ด้วย authenticate("jwt", "session") { } Ktor จะลองใช้แต่ละรายการตามลำดับ และยอมรับคำขอหากผู้ให้บริการรายการใดรายการหนึ่งตรวจสอบสำเร็จ

การตอบกลับคำท้าทายแบบกำหนดเอง

ผู้ให้บริการแต่ละรายการมีบล็อก 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, เซสชัน, Basic หรือ OAuth)
  • ปกป้องเส้นทางด้วย authenticate("providerName") { }
  • JWT: โทเค็นไม่มีสถานะ ลงลายเซ็นเมื่อเข้าสู่ระบบ ตรวจสอบด้วย verifier และอ่านข้อมูลกำกับใน validate
  • เซสชัน: มีสถานะ ใช้ call.sessions.set() เมื่อเข้าสู่ระบบ และใช้ clear() เมื่อออกจากระบบ
  • ใช้ challenge เพื่อปรับแต่งรูปแบบการตอบกลับ 401

คำถามที่พบบ่อย

บทเรียน “ปลั๊กอินการยืนยันตัวตน: JWT และ Session” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ปลั๊กอินการยืนยันตัวตน: JWT และ Session” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ปลั๊กอินการยืนยันตัวตน: JWT และ Session”

รักษาความปลอดภัยให้เส้นทาง Ktor ด้วยโทเค็น JWT bearer และการยืนยันตัวตนด้วยเซสชัน คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ปลั๊กอินการยืนยันตัวตน: JWT และ Session” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่าโปรเจกต์ Ktor: embeddedServer และโมดูลแอปพลิเคชัน
  2. การกำหนดเส้นทางและพารามิเตอร์ที่ระบุชนิด
  3. การเจรจาเนื้อหาและ kotlinx.serialization
  4. ปลั๊กอินการยืนยันตัวตน: JWT และ Session
← กลับไปที่ Kotlin Academy