ปลั๊กอินการยืนยันตัวตน: 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่าโปรเจกต์ Ktor: embeddedServer และโมดูลแอปพลิเคชัน
- การกำหนดเส้นทางและพารามิเตอร์ที่ระบุชนิด
- การเจรจาเนื้อหาและ kotlinx.serialization
- ปลั๊กอินการยืนยันตัวตน: JWT และ Session