ข้ามไปยังเนื้อหา

Themes

Keycloak แสดงผลหน้าต่างๆ โดยใช้ HTML template ของตัวเอง แต่ละหมวดหมู่ของหน้าเรียกว่า theme type:

Theme typeสิ่งที่ควบคุม
loginหน้า login, ลงทะเบียน, รีเซ็ตรหัสผ่าน และ OTP
accountAccount management console แบบ self-service
emailEmail template (verification, password reset ฯลฯ)
adminKeycloak admin console เอง

login theme คือสิ่งที่ end-user ของคุณเห็น การปรับแต่งให้ตรงกับแบรนด์ของคุณทำให้ประสบการณ์การ authenticate รู้สึกเป็นส่วนหนึ่งของผลิตภัณฑ์

คุณสามารถเปลี่ยน login theme ที่ใช้งานอยู่ของ realm ใดก็ได้จาก admin console:

  1. เปิด admin console และเลือก realm ของคุณจาก drop-down ซ้ายบน
  2. คลิก Realm settings ใน sidebar ซ้าย
  3. คลิกแท็บ Themes
  4. ใต้ Login theme เปิด drop-down และเลือก theme ของคุณ (เช่น keycloak สำหรับค่าเริ่มต้น หรือชื่อ custom theme ของคุณ)
  5. ใต้ Account theme, Email theme และ Admin console theme เลือกตามต้องการ
  6. คลิก Save

การเปลี่ยนแปลงมีผลทันที ไม่จำเป็นต้องรีสตาร์ท

custom theme คือโฟลเดอร์ที่คุณวางไว้ใต้โฟลเดอร์ themes/ ของ Keycloak โครงสร้างขั้นต่ำสำหรับ login theme มีลักษณะดังนี้:

flowchart TD
  T["themes/"] --> B["my-brand/"]
  B --> L["login/"]
  L --> P["theme.properties"]
  L --> R["resources/"]
  R --> CSS["css/login.css"]
  R --> IMG["img/logo.png"]
  L --> M["messages/messages_en.properties"]
A custom theme's directory structure

ไฟล์ theme.properties ประกาศว่า theme ของคุณสืบทอดจาก parent theme ใด เริ่มต้นด้วยการขยาย theme keycloak ที่มีอยู่แล้ว เพื่อให้คุณต้อง override เฉพาะสิ่งที่เปลี่ยนแปลงเท่านั้น:

parent=keycloak
import=common/keycloak

ด้วยการตั้งค่านี้ Keycloak จะ fallback ไปยัง parent สำหรับ template หรือ resource ใดที่คุณยังไม่ได้ override

สำหรับ Keycloak รุ่น Quarkus ให้คัดลอกโฟลเดอร์ theme ของคุณไปยัง /opt/keycloak/themes/ ของ container วิธีง่ายที่สุดด้วย Docker คือการใช้ bind-mount:

Terminal window
docker run -p 8080:8080 \
-v "$(pwd)/themes/my-brand:/opt/keycloak/themes/my-brand" \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:latest \
start-dev

หลังจาก container เริ่มต้น theme ของคุณจะปรากฏใน drop-down Login theme ใน Realm settings

หากคุณต้องการสร้างหน้า login ด้วย React Keycloakify (keycloakify.dev) คือ tool ที่แนะนำ Keycloakify จะคอมไพล์ React component ของคุณเป็น Keycloak-compatible theme JAR ผลลัพธ์เป็นไฟล์ .jar ที่คุณวางไว้ใน /opt/keycloak/providers/ — Keycloak จะ auto-discover ให้ตอน startup

Keycloakify ให้คุณควบคุม React component แบบ full สำหรับทุกหน้า login โดยยังคงเข้ากันได้กับ protocol การส่งข้อความและ form ภายในของ Keycloak

ตัวเลือกBenefitCost
Custom theme สืบทอดจาก keycloak parentoverride เฉพาะไฟล์ที่ต้องเปลี่ยน ได้ประโยชน์จาก fix และ feature ใหม่ของ parent theme โดยอัตโนมัติต้องตรวจสอบทุกครั้งที่อัปเกรด Keycloak ว่า template ที่ override ไว้ยังเข้ากันได้กับ parent เวอร์ชันใหม่หรือไม่
Keycloakify (React-based theme)ควบคุม UI แบบ full ด้วย React component ที่ทีม frontend คุ้นเคยอยู่แล้วเพิ่มขั้นตอน build เป็น JAR และต้องเรียนรู้จุดเชื่อมต่อกับ protocol ภายในของ Keycloak
แก้ไข built-in theme (keycloak) โดยตรงเห็นผลเร็วเพราะไม่ต้องสร้างโครงสร้าง theme ใหม่การอัปเกรด Keycloak จะเขียนทับไฟล์ built-in ทั้งหมด ทำให้การแก้ไขหายไปโดยไม่รู้ตัว
  • แก้ไข built-in theme (keycloak) ไว้ในที่ตั้งเดิมโดยตรง — เมื่ออัปเกรด Keycloak เวอร์ชันใหม่ ไฟล์ built-in ทั้งหมดจะถูกเขียนทับ ทำให้การปรับแต่งหายไปโดยไม่มีการเตือน ควรสร้าง custom theme แยกที่สืบทอดจาก parent เสมอ
  • ไม่ทดสอบ custom theme กับ theme type อื่นนอกจาก login — ปรับแต่งเฉพาะหน้า login แต่ลืมว่า account, email และ admin theme ก็ควรได้รับการพิจารณาเรื่อง branding ด้วยเช่นกัน โดยเฉพาะ email template ที่ user เห็นบ่อยไม่แพ้หน้า login
  • Deploy custom theme แล้วไม่รีสตาร์ทหรือ clear cache ตอน dev — Keycloak cache theme resource ไว้ในโหมด production ทำให้การเปลี่ยนแปลงไม่ปรากฏจนกว่าจะรีสตาร์ทหรือปิด theme cache ระหว่างพัฒนา

💡 ตัวอย่างจากของจริง

Keycloakify ในโปรดักชัน — ทีม frontend จำนวนมากใช้ Keycloakify เพื่อ compile React component ชุดเดียวกับที่ใช้ในแอปหลัก ให้กลายเป็นหน้า login ของ Keycloak ทำให้ประสบการณ์ผู้ใช้ต่อเนื่องเป็นแบรนด์เดียวกันตั้งแต่หน้า login ไปจนถึงตัวแอป

Enterprise white-labeling — บริษัทที่ให้บริการ platform แบบ multi-tenant มักสร้าง custom theme แยกต่อ realm เพื่อให้แต่ละลูกค้าเห็นหน้า login ที่มี logo และสีของแบรนด์ตัวเอง ทั้งที่ใช้ Keycloak instance เดียวกันเบื้องหลัง

Keycloak theme type ตัวใดที่ควบคุมหน้า login และ registration?
คุณเปลี่ยน login theme ที่ใช้งานอยู่ของ realm ได้ที่ไหนใน admin console?
บรรทัด parent= ใน theme.properties ทำอะไร?
Keycloakify ทำอะไร?