วิธีรักษาความปลอดภัยแอป Undertow ด้วย OIDC และ pac4j
เรียนรู้วิธีเชื่อมต่อแอปพลิเคชัน Undertow กับผู้ให้บริการ OIDC โดยใช้ไลบรารี undertow-pac4j เวอร์ชัน 6.1.0 บน Java 17 พร้อมตัวอย่างโค้ดและขั้นตอนการตั้งค่า

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- ใช้ undertow-pac4j v6.1.0, Undertow v2.4 และ Java 17 สำหรับโปรเจกต์ Maven
- เพิ่มแฮนเดิลเลอร์ 3 ตัว ได้แก่ SecurityHandler, CallbackHandler และ LogoutHandler
- รองรับผู้ให้บริการ OIDC หลายราย เช่น Keycloak, Google, Microsoft Entra ID และ Okta
- จัดการเซสชันผ่าน SessionAttachmentHandler พร้อมคุกกี้ JSESSIONID แบบ HttpOnly
การเชื่อมต่อแอปพลิเคชัน Undertow เข้ากับผู้ให้บริการ OpenID Connect (OIDC) สามารถทำได้อย่างง่ายดายโดยอาศัยไลบรารี undertow-pac4j เพื่อเพิ่มแฮนเดิลเลอร์หลัก 3 ตัวลงใน PathHandler ได้แก่ SecurityHandler, CallbackHandler และ LogoutHandler ซึ่งช่วยให้ระบบมีความปลอดภัยและจัดการกระบวนการยืนยันตัวตนได้อย่างครบถ้วน
ในตัวอย่างนี้กำหนดให้ใช้งาน undertow-pac4j v6.1.0 ร่วมกับ Undertow v2.4 และ Java 17 โดยการตั้งค่า OIDC client จะมีรูปแบบเช่นเดียวกับคู่มือ Spring Boot OIDC ทั้งนี้ผู้ให้บริการ OIDC จะทำหน้าที่แสดงหน้าจอเข้าสู่ระบบและตรวจสอบสิทธิ์ผู้ใช้ ซึ่งอาจเป็น Keycloak, Google, Microsoft Entra ID, Okta หรือเซิร์ฟเวอร์สาธารณะสำหรับทดสอบของ pac4j เอง
เริ่มต้นสร้างโปรเจกต์ Maven เปล่าสำหรับ Java 17 หรือใหม่กว่า พร้อมสร้างไฟล์ pom.xml ที่กำหนดเป้าหมายคอมไพิลเลอร์เป็น Java 17 และใช้ exec plugin สำหรับรันคลาส App จากนั้นสร้างไฟล์ src/main/java/org/example/SecurityConfigFactory.java เพื่อสร้างคอนฟิกของ pac4j พร้อม OIDC client โดยระบบจะอ่านเมทาเดตาจาก discovery URI และใช้ URL คอลแบ็กที่มีพารามิเตอร์ ?client_name=OidcClient ต่อท้าย
การใช้งานไลบรารี pac4j ร่วมกับ Undertow ช่วยให้นักพัฒนาไม่ต้องเขียนโค้ดจัดการระบบล็อกอินและเซสชันเองตั้งแต่ต้น โดยอาศัยสถาปัตยกรรมแฮนเดิลเลอร์ที่แยกหน้าที่กันอย่างชัดเจน ช่วยลดช่องโหว่ด้านความปลอดภัยที่มักเกิดขึ้นจากการจัดการโทเค็นและเซสชันด้วยตนเอง
สำหรับการจัดการเซสชัน SessionAttachmentHandler จะต้องทำหน้าที่ห่อหุ้มพาทที่ได้รับการป้องกัน พาทคอลแบ็ก และพาทออกจากระบบ เพื่อแนบ SessionManager และ SessionConfig ของ Undertow เข้ากับแต่ละคำขอ โดยมีคุกกี้เซสชันคือ JSESSIONID ที่กำหนดค่าเป็น HttpOnly นอกจากนี้คอมโพเนนต์เริ่มต้นอย่าง FrameworkAdapterImpl จะช่วยกำหนดค่าเว็บคอนเทนต์ สตรีมเซสชัน และโปรไฟล์เมเนเจอร์ให้โดยอัตโนมัติหากไม่ได้ระบุไว้เป็นอย่างอื่น
ในส่วนของเส้นทางที่ต้องป้องกัน SecurityHandler.build จะทำหน้าที่เปลี่ยนเส้นทางผู้ใช้ที่ไม่ได้เข้าสู่ระบบไปยังผู้ให้บริการ OIDC และเรียกใช้งานแฮนเดิลเลอร์สำหรับผู้ใช้ที่ยืนยันตัวตนแล้ว ส่วน CallbackHandler จะรับรหัสอนุญาต นำไปแลกรับ access token และ ID token พร้อมตรวจสอบความถูกต้องและบันทึกโปรไฟล์ นอกจากนี้ยังมี LogoutHandler สำหรับลบโปรไฟล์และยกเลิกเซสชันผ่านพารามิเตอร์ setDestroySession(true)

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
เมื่อตั้งค่าเสร็จสิ้น สามารถรันแอปพลิเคชันผ่านคำสั่ง mvn clean compile exec:java จากไดเรกทอรีที่มีไฟล์ pom.xml และเปิดใช้งานผ่านเบราว์เซอร์ที่ http://localhost:8080/protected ซึ่งระบบจะนำทางไปยังผู้ให้บริการ OIDC เพื่อเข้าสู่ระบบก่อนจะพาผู้ใช้กลับมายังหน้าเว็บที่ได้รับการป้องกันพร้อมแสดงชื่อผู้ใช้
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น