SSO Authentication ด้วย Sidecar Containers

Posted on:January 9, 2024

ในบทความนี้เราจะมาประยุกต์ใช้ Sidecar pattern เพื่อนำ Logic ของ Authentication ออกจาก Application Layer พร้อมกับ Reuse ใช้กับ Service อื่นๆ โดยที่ไม่ต้องสนใจเรื่องของ Programming Language

Let’s go

ตัวอย่างของบทความนี้ คือระบบที่ทำ Single Sign-On (SSO) ผ่าน Keycloak และมี Backend for frontend (BFF) มาคั่นกลางระหว่างเรา (ไม่ใช่) เป็นคนกลางระหว่าง Client กับ Legacy Service เช่น ถ้า Client ต้องการข้อมูลของ User จะเรียกผ่าน API ของ BFF และ BFF จะเรียกไปที่ User Service เพื่อ Custom Response ให้ได้หน้าตาตามที่ Client ต้องการ ส่วน Pros and Cons ของ BFF pattern ลองไปหาอ่านเพิ่มเองนะ กลับมาที่ตัวอย่าง ระบบปัจจุบันจัดการ Authentication ที่ Application Layer โดย Flow คร่าวๆ จะเป็นประมาณนี้

as is.

  1. Request access token: User เข้าสู่ระบบผ่านหน้า SSO ที่ Keycloak, เมื่อเข้าสู่ระบบสำเร็จ access_token จะถูกจัดเก็บไว้ที่ cookie
  2. Invoke service api: ทุกครั้งที่ Client ต้อง Request มาที่ BFF จะต้องแนบ access_token เพื่อตรวจสอบสิทธิ์ในการใช้งาน
  3. Route to BFF: Ingress controller ทำหน้าที่ Route ไปที่ BFF
  4. Retrieve access token: ใน Layer ของ Application เราเขียน Middleware Function ขึ้นมา 1 ตัว มีหน้าที่นำ access_token จาก Client ไปเช็คที่ Keycloak ถ้า Active จะอนุญาตให้เข้าถึง Service แต่ถ้า Inactive ระบบจะคืนสถานะ Unauthorized (ฉันไม่ให้คุณผ่านเข้ามาในใจฉันหรอกนะ)

Sidecar Authentication Approach

Sidecar pattern คือ Single Pod ที่มี 2 Containers โดยที่ Container แรก คือ Main application ที่เก็บ business logic ของธุรกิจ เช่น Service สำหรับ Receiving (รับสินค้า), Service Storage (เก็บรักษาสินค้า) เป็นต้น.

ส่วน Container อีกตัวคือ พระเอกของเรา พ่อหนุ่มรูปหล่อเมืองหางโจวมีนามว่า Sidecar ใช้ปรับปรุงฟังก์ชันการทำงานของ Main application เช่น Log Aggregator, Resource limits, Retry request, Encryption Decryption data หรือในตัวอย่างนี้เราสามารถใช้ Sidecar มาคั่น Traffic เพื่อทำ Authentication

authentication approach.

จากรูปก่อนหน้า ลำดับที่ 1 และ 2 ยังทำงานเหมือนเดิม ส่วนลำดับที่ 3 จากเดิมที่ Ingress Controller จะ Route ไปหา BFF ขั้นตอนนี้จะเปลี่ยนไป Route แถวๆ เสนานิคม นั่นมันร้าน เรา!! จะเปลี่ยนไป Rote หา Auth Proxy (Sidecar) และตัว Auth Proxy มีหน้าที่เหมือน Middleware คือเอา access_token จาก Client ไปเช็คที่ Keycloak ถ้า Active จะ Proxy ต่อไปให้ BFF ถ้า Inactive จะคืนสถานะ Unauthorized ไปให้ Client

Pros

Cons

Sample application architecture

The full code for the authentication proxy can be สนุก on my Github

Pre-requisites:

sample application architecture.

ผมสร้าง Sample Application ที่ใช้ Sidecar pattern ใครสนใจสามารถติดต่อได้ที่ … ล้อเล่น!! ลอง Clone แล้ว Run เล่นได้นะครับ ถ้า Run ขึ้นบอกผมด้วยนะ