0

Keycloak toàn tập: Những mảnh ghép cốt lõi Backend Developer cần nắm vững (Phần 1)

Có một "lời nguyền" vô hình trong giới Backend Developer: Cứ mỗi lần khởi tạo dự án mới, chúng ta lại lặp lại một vòng luẩn quẩn đầy ngao ngán với các luồng Login, Register, quản lý JWT, refresh token hay nhức đầu nhất là phân quyền. Việc tự tay xây dựng hệ thống Authentication & Authorization không chỉ ngốn đi hàng tuần lễ code - thời gian đáng lẽ phải dành cho những business logic hái ra tiền - mà còn giống như việc bạn đang tự gài một quả bom nổ chậm về bảo mật. Tại sao phải "phát minh lại chiếc bánh xe" trong khi thế giới đã có một tiêu chuẩn công nghiệp mạnh mẽ để ủy quyền toàn bộ trọng trách này?

Để giải phóng Backend khỏi gánh nặng này, chúng ta cần một "tổng chỉ huy" bảo mật. Và đó là sân khấu của Keycloak. Dành riêng cho các kỹ sư đang muốn nâng cấp tư duy thiết kế hệ thống, "Keycloak toàn tập: Những mảnh ghép cốt lõi Backend Developer cần nắm vững". Bài viết này không phải là một cuốn tài liệu dịch lại nhàm chán. Đây là tấm bản đồ thực chiến giúp bạn bóc tách kiến trúc, hiểu sâu vòng đời của token và làm chủ "người gác cổng" quyền năng nhất nhì thế giới mã nguồn mở. Hãy cùng bắt đầu!.

Phần 1: Bức tranh tổng quan

1. Vấn đề: Tại sao không nên tự code lại tính năng Login/Register/Quản lý User?

Nhiều đội ngũ phát triển khi mới bắt đầu thường có suy nghĩ: "Tính năng đăng nhập, đăng ký thì có gì khó, chỉ cần tạo bảng User trong database rồi so sánh mật khẩu là xong!". Tuy nhiên, thực tế chứng minh đây là một cái bẫy kỹ thuật (technical debt) khổng lồ. Việc tự xây dựng hệ thống quản lý người dùng mang lại 3 điểm nghẽn lớn:

  • Rủi ro Bảo mật (Security Risks): Bảo mật không chỉ là băm (hash) mật khẩu. Bạn sẽ phải tự tay xử lý hàng loạt bài toán hóc búa: phòng chống tấn công dò mật khẩu (Brute-force), chặn XSS/CSRF, quản lý vòng đời và thu hồi Token (Revoke/Refresh), cũng như bảo mật luồng khôi phục mật khẩu. Chỉ một sơ suất nhỏ trong logic code cũng có thể làm lộ lọt toàn bộ dữ liệu người dùng.

  • Chi phí bảo trì và Mở rộng (Maintenance & Scalability): Hệ thống ban đầu có thể đơn giản. Nhưng sáu tháng sau, doanh nghiệp yêu cầu thêm: Xác thực hai yếu tố (2FA/OTP), Đăng nhập bằng Google/Facebook (Social Login), đăng nhập không mật khẩu (WebAuthn/Passkey). Nếu tự code, đội ngũ sẽ phải liên tục "đập đi xây lại", tiêu tốn hàng tháng trời thay vì tập trung vào logic nghiệp vụ cốt lõi mang lại doanh thu.

  • Rủi ro chuẩn hóa (Compliance): Các hệ thống hiện đại giao tiếp với nhau qua các tiêu chuẩn công nghiệp khắt khe như OAuth 2.0 hay OpenID Connect. Tự viết lại các giao thức này từ con số không rất dễ sinh ra lỗi sai chuẩn, khiến hệ thống của bạn gần như không thể tích hợp an toàn với các đối tác thứ ba sau này.

2. Keycloak là gì? Định nghĩa về IAM và SSO

Để giải quyết triệt để các vấn đề trên, các hệ thống lớn tìm đến các giải pháp chuyên dụng, và Keycloak (được bảo trợ bởi Red Hat) là một trong những hệ thống mã nguồn mở hàng đầu thế giới.

Để hiểu Keycloak, chúng ta cần nắm rõ hai khái niệm cốt lõi mà nó giải quyết:

  • IAM (Identity and Access Management - Quản lý định danh và truy cập): Đây là một hệ thống bảo mật sinh ra để trả lời hai câu hỏi: "Bạn là ai?" (Authentication - Xác thực) và "Bạn được phép làm gì?" (Authorization - Phân quyền). Hệ thống IAM quản lý toàn bộ vòng đời của một tài khoản người dùng từ lúc sinh ra đến lúc bị khóa/xóa bỏ.

  • SSO (Single Sign-On - Đăng nhập một lần): Đây là một tính năng đặc quyền của IAM. Hãy tưởng tượng công ty bạn có Hệ thống Nhân sự, Hệ thống Kế toán và Mạng nội bộ. Thay vì phải nhớ 3 mật khẩu và đăng nhập 3 lần, người dùng chỉ cần đăng nhập một lần duy nhất vào hệ thống trung tâm. Sau đó, họ có thể di chuyển xuyên suốt giữa các ứng dụng này một cách liền mạch.

Tóm lại: Keycloak chính là một "Cơ quan cấp hộ chiếu và thẻ căn cước" độc lập cho toàn bộ hệ sinh thái phần mềm của bạn.

3. Vị trí của Keycloak trong hệ thống: Phác họa kiến trúc tổng thể

Trong kiến trúc hiện đại (đặc biệt là Microservices), Keycloak không nằm chung mã nguồn hay database với các ứng dụng của bạn. Nó đứng tách biệt hoàn toàn với vai trò là một Identity Provider (IdP).

Dưới đây là bức tranh tổng quan về cách các thành phần tương tác:

[Trình duyệt/Mobile App] ➡️ [API Gateway] ➡️ [Các Backend Microservices] Và đứng song song bên ngoài là: ➡️ [Keycloak Server]

image.png

Luồng hoạt động tổng thể (Bức tranh hệ thống):

  1. Chặn cửa (API Gateway): Frontend gửi một yêu cầu truy cập dữ liệu lên API Gateway. Gateway phát hiện người dùng này chưa có "thẻ thông hành" (Token).

  2. Chuyển hướng (Redirect): Gateway (hoặc Frontend) lập tức điều hướng người dùng sang trang Đăng nhập do chính Keycloak cung cấp.

  3. Xác thực tại Keycloak: Người dùng nhập username/password trực tiếp trên giao diện của Keycloak. Ứng dụng Backend của bạn hoàn toàn không biết và không lưu trữ mật khẩu này.

  4. Cấp phát Token: Keycloak xác nhận người dùng hợp lệ và trả về một cặp chìa khóa: ID Token (chứa thông tin cá nhân như tên, email) và Access Token (chứa các quyền hạn).

  5. Truy cập tài nguyên: Frontend mang chiếc Access Token này đính kèm vào mỗi request gửi qua API Gateway để đi vào Backend.

  6. Kiểm duyệt nội bộ: API Gateway (hoặc các Backend Services) chỉ cần kiểm tra chữ ký kỹ thuật số trên Access Token (xem có đúng do Keycloak phát hành hay không) là có thể cho phép người dùng thao tác lấy dữ liệu.

Với kiến trúc này, Backend của bạn hoàn toàn rảnh tay, không còn phải lo nghĩ về việc quản lý mật khẩu hay luồng đăng nhập phức tạp nữa. Mọi gánh nặng bảo mật đều đã được "chuyển giao" an toàn cho Keycloak.

Phần II: Domain Model - Các khái niệm "Xương sống"

1. Realm (Lãnh địa) & Multi-tenancy 🏢

Trong kiến trúc phần mềm, Multi-tenancy là việc một phiên bản (instance) duy nhất của phần mềm chạy trên máy chủ nhưng phục vụ nhiều nhóm khách hàng khác nhau (gọi là tenant). Mỗi tenant có một không gian dữ liệu, cấu hình và người dùng hoàn toàn biệt lập, dù họ đang dùng chung một hệ thống vật lý hoặc một cluster.

Trong Keycloak, đơn vị cốt lõi để triển khai Multi-tenancy chính là Realm (Lãnh địa/Không gian).

  • Tính cô lập tuyệt đối: Một Realm là một không gian mạng độc lập. Người dùng đăng nhập ở Realm A hoàn toàn không có quyền hạn hay sự hiện diện nào ở Realm B, trừ khi được cấu hình đặc biệt. Các cấu hình về luồng đăng nhập (SSO), chính sách mật khẩu, hay giao diện email của mỗi Realm là riêng biệt.

  • Ví dụ trực quan: Hãy tưởng tượng Keycloak Server của bạn là một Tòa nhà chung cư.

    • Mỗi Realm là một căn hộ đóng kín trong tòa nhà đó.
    • Bạn có thể trang trí căn hộ của mình (đổi theme trang Login), có những người sống trong đó (Users), có chìa khóa riêng (Credentials/Tokens), và có các quy tắc sinh hoạt riêng (Authentication Flows).
    • Người ở căn hộ A không thể tự ý mở cửa căn hộ B, dù họ sống trong cùng một tòa nhà.

2. Master Realm và App Realm

  • 👑 Master Realm: Đây là "Ban quản lý tòa nhà". Realm này được Keycloak tạo ra mặc định lúc cài đặt. Bạn chỉ dùng Master Realm để đăng nhập với tư cách là Quản trị viên tối cao (Super Admin) nhằm mục đích cấu hình hệ thống và tạo ra các tầng văn phòng mới (tạo các Realm khác). Tuyệt đối không dùng Realm này để chứa người dùng cuối.

  • 👥 App Realm (Regular Realm): Đây là các "công ty khách thuê". Khi bạn có một dự án phần mềm, bạn sẽ tạo một App Realm riêng (ví dụ: ecommerce-realm hay erp-realm) để chứa toàn bộ người dùng, ứng dụng và cấu hình bảo mật riêng của dự án đó.

Để xem chúng ta đã nắm bắt khái niệm này như thế nào, hãy thử giải quyết bài toán sau:

Giả sử bạn đang xây dựng một nền tảng quản lý trường học (SaaS) và chuẩn bị bán cho 2 trường đại học khác nhau là Trường A và Trường B. Yêu cầu là sinh viên trường này không được phép đăng nhập vào hệ thống của trường kia.

Theo bạn, chúng ta nên thiết lập các Realm trong Keycloak như thế nào cho hệ thống này? Và tài khoản của chính bạn (người bảo trì toàn bộ hệ thống phần mềm) thì nên được đặt ở đâu?

  • Trường A và Trường B (Sự cách ly): 🏫 Chúng ta sẽ tạo hai App Realm riêng biệt, ví dụ: school-a-realmschool-b-realm. Toàn bộ sinh viên và giảng viên của Trường A sẽ được tạo tài khoản trong school-a-realm. Nhờ sự cách ly tuyệt đối của hệ thống Realm, sinh viên Trường A không có cách nào dùng tài khoản đó để đăng nhập vào trang web của Trường B.

  • Tài khoản của bạn (Người bảo trì): 👑 Bạn sẽ sử dụng tài khoản nằm ở Master Realm. Với tư cách là quản trị viên hệ thống tại Master Realm, bạn có quyền cao nhất: nhìn thấy, tạo mới và cấu hình cả hai Realm của hai trường, đồng thời tài khoản của bạn được tách biệt hoàn toàn khỏi tập dữ liệu người dùng cuối.

3. Client (Máy khách) là gì?

Trong Keycloak, "Client" không phải là người dùng (con người). Client chính là các ứng dụng (website, app điện thoại, backend) đang gọi đến Keycloak để nhờ xử lý việc đăng nhập và phân quyền.

  • 🔓 Public Client: Dành cho các ứng dụng không thể cất giấu thông tin bí mật (Client Secret) một cách an toàn. Ví dụ điển hình là các ứng dụng Frontend (React, Vue, Angular) chạy trực tiếp trên trình duyệt của người dùng cuối, hoặc Mobile App. Vì mã nguồn tải về máy người dùng, bất kỳ ai cũng có thể soi được các mã bí mật nếu chúng ta để ở đó.

  • 🔒 Confidential Client: Dành cho các ứng dụng chạy trên môi trường máy chủ an toàn của bạn (Backend API, Microservices). Vì chạy trên máy chủ (server-side), chúng có thể cất giấu an toàn một đoạn mã bí mật (Client Secret - hoạt động giống như mật khẩu riêng của ứng dụng) để xác thực một cách đáng tin cậy với Keycloak.

Áp dụng vào hệ thống trường học của chúng ta: Giả sử trường có một trang web giao diện cho sinh viên xem điểm viết bằng ReactJS, và một hệ thống máy chủ xử lý logic điểm số viết bằng Spring Boot/Node.js.

Khi khai báo 2 phần mềm này vào Keycloak, bạn sẽ chọn loại Client nào (Public hay Confidential) cho ReactJS, và loại nào cho hệ thống backend Spring Boot/Node.js? Mấu chốt ở đây là gì?

  1. Trang web ReactJS: Đây bắt buộc phải là Public Client 🔓.

    • Lý do cốt lõi: Mã nguồn ReactJS chạy trực tiếp trên trình duyệt của người dùng. Bất kỳ ai nhấn F12 (Developer Tools) đều có thể đọc được mã nguồn và các file cấu hình. Nếu bạn cấu hình nó là Confidential và giấu một đoạn mã bí mật (Client Secret) ở đây, hacker sẽ tìm thấy nó ngay lập tức. Vì ứng dụng này không có khả năng giữ bí mật, Keycloak xếp nó vào loại Public.
  2. Hệ thống xử lý điểm Spring Boot/Node.js: Đây là Confidential Client 🔒.

    • Lý do cốt lõi: Mã nguồn này chạy trên môi trường máy chủ an toàn mà bạn kiểm soát, người dùng cuối không thể soi được. Do đó, bạn có thể cất giấu an toàn một chuỗi Client Secret (thường nằm trong file .env). Mỗi khi Backend này gọi đến Keycloak, nó sẽ trình chuỗi bí mật này ra, đóng vai trò như một "chứng minh thư" tuyệt đối an toàn để xác nhận danh tính với hệ thống.

4. User, Group & Role 👥

Sau khi đã có Realm để tách biệt từng trường học và Client để đại diện cho các ứng dụng, câu hỏi tiếp theo là: Ai sẽ đăng nhập vào hệ thống và họ được phép làm những gì? Đây chính là lúc ba khái niệm User, Group và Role xuất hiện. Chúng giúp Keycloak quản lý người dùng, tổ chức người dùng thành các nhóm và kiểm soát quyền truy cập một cách linh hoạt, đặc biệt khi hệ thống có hàng trăm hoặc hàng nghìn tài khoản.

  • User (Người dùng): Là những cá nhân thực sự sẽ đăng nhập vào hệ thống (ví dụ: khách hàng Nguyễn Văn A, nhân viên Trần Thị B).

Nhớ lại ở phần trước, chúng ta đã tạo 2 trường học riêng biệt là: school-a-realmschool-b-realm. Giả sử bạn là Giám đốc Sở giáo dục, tên đăng nhập của bạn là education_director. Bạn muốn mình có thể đăng nhập vào cả hai hệ thống này để kiểm tra.

Theo bạn, trong Keycloak, chúng ta có thể tạo một tài khoản User education_director duy nhất để dùng chung đăng nhập qua lại giữa 2 Realm được không? Hay chúng ta bắt buộc phải làm cách khác?

Hãy cùng nhớ lại Tính cô lập mình nhắc tới ở trên, đây được xem là một trong những nguyên tắc bảo mật tối thượng của Keycloak: Người dùng (User) thuộc về duy nhất một Realm. Vì vậy câu trả lời cở đây là: "KHÔNG, bắt buộc phải làm cách khác".

Để giải quyết bài toán của Giám đốc Sở, trong thực tế quản trị Keycloak, chúng ta có 2 cách giải quyết:

  • Cách 1 - Đơn giản và trực tiếp (Tạo nhiều tài khoản): Bạn sẽ phải tạo một tài khoản education_director bên trong school-a-realm, và tạo thêm một tài khoản education_director nữa bên trong school-b-realm. Dù tên đăng nhập và mật khẩu có thể do bạn đặt giống hệt nhau, nhưng với Keycloak, đây là 2 người dùng hoàn toàn khác biệt ở 2 thế giới khác nhau.

  • Cách 2 - Giải pháp nâng cao (Identity Brokering): Keycloak có một tính năng rất xịn gọi là "Identity Brokering". Bạn có thể thiết lập để school-a-realm tin tưởng school-b-realm. Khi đó, Giám đốc sở đang ở hệ thống trường A có thể chọn nút "Đăng nhập bằng tài khoản trường B". Lúc này Keycloak sẽ tự động kết nối và cho phép truy cập, nhưng bản chất sâu xa là nó vẫn tự động tạo ra một bản sao tài khoản (shadow user) ở Realm đích.

Bây giờ, không gian (Realm) đã có, ứng dụng (Client) cũng đã được khai báo, người dùng (User) cũng đã có mặt đủ. Thứ chúng ta cần đưa vào tiếp theo chính là quyền hạn của họ:

Để dễ phân biệt, hãy nhớ quy tắc này: Group đại diện cho việc bạn LÀ AI trong tổ chức, còn Role đại diện cho việc bạn ĐƯỢC LÀM GÌ.

  • Role (Vai trò/Quyền hạn): Là những "thẻ bài" cấp phép hành động.

    • Realm Role: Quyền hạn có tác dụng toàn cục trên toàn bộ Realm. Ví dụ: quyền admin_truong_hoc.

    • Client Role: Quyền hạn chỉ có giá trị nội bộ trong một ứng dụng (Client) cụ thể. Ví dụ: ứng dụng phần mềm chấm thi (Client A) có quyền duyet_bai, nhưng quyền này vô giá trị khi sang ứng dụng thư viện (Client B).

  • Group (Nhóm): Giải pháp cho bài toán vận hành. Thay vì gán từng Role cho từng User (cực kỳ tốn công khi nhân sự thay đổi), bạn định nghĩa các Group (ví dụ: IT-Department, Dev-Team). Bạn gán Role cho Group, và khi một User được thêm vào Group, họ tự động kế thừa toàn bộ các Role đó.

Để kiểm tra sự thấu hiểu, tôi có một tình huống thực tế cho bạn:

Trong hệ thống trường học trên, chúng ta có sinh viên "Nam" và giảng viên "Cô Lan". Theo bạn, chúng ta nên thiết lập các Group và Role như thế nào để đảm bảo chỉ có "Cô Lan" mới có quyền nhập điểm vào hệ thống, còn "Nam" thì chỉ được quyền xem điểm?

Hãy cùng mình giải quyết bài toán phân quyền cho Nam và Cô Lan. Để hệ thống gọn gàng, dễ quản lý và dễ mở rộng về sau, chúng ta sẽ thiết lập theo mô hình sau:

  1. Tạo Role (Tạo "thẻ bài" quyền hạn): Đầu tiên, bạn tạo 2 Client Role trong Keycloak dành riêng cho ứng dụng quản lý điểm: quyen_xem_diemquyen_nhap_diem.

  2. Tạo Group (Tạo phòng ban): Tạo 2 Group riêng biệt: Nhom_Sinh_VienNhom_Giang_Vien.

  3. Gán Role vào Group (Giao quyền cho nhóm): * Bạn cấp quyen_xem_diem cho Nhom_Sinh_Vien.

    • Bạn cấp quyen_nhap_diem (và có thể cả quyen_xem_diem) cho Nhom_Giang_Vien.
  4. Thêm User vào Group (Phân bổ nhân sự): * Kéo tài khoản của "Nam" thả vào Nhom_Sinh_Vien.

    • Kéo tài khoản của "Cô Lan" thả vào Nhom_Giang_Vien.

⏭️Kết quả: Khi Nam đăng nhập, hệ thống kiểm tra thấy Nam ở nhóm Sinh viên nên tự động cấp quyền xem điểm. Tương tự với Cô Lan. Điểm mấu chốt (Tại sao phải làm vậy): Sang năm học mới, trường đón thêm 1000 sinh viên. Thay vì phải đi bấm cấp quyền xem điểm 1000 lần cho từng người (gán Role trực tiếp cho User), bạn chỉ cần đưa cả 1000 tài khoản đó vào Nhom_Sinh_Vien là xong. Tính năng Group giúp quản trị viên tiết kiệm rất nhiều công sức.

5. Identity Provider (IdP) & Identity Brokering 🔗

Hãy tưởng tượng Keycloak giống như một lễ tân thông minh ở sảnh tòa nhà. Lễ tân có thể tự kiểm tra thẻ nhân viên nếu danh sách nhân viên được lưu tại quầy (IdP), hoặc kiểm tra thẻ do một đơn vị khác cấp như Google, Microsoft, Facebook rồi vẫn cho phép vào tòa nhà (Identity Brokering). Nhờ đó người dùng chỉ cần một tài khoản quen thuộc để truy cập nhiều hệ thống khác nhau. 🚪✨

Nếu Role trả lời câu hỏi "Bạn được làm gì?" và Group trả lời "Bạn thuộc nhóm nào?" thì Identity Provider trả lời "Bạn là ai?", còn Identity Brokering trả lời "Ai đã xác nhận danh tính của bạn?". 🔐

  • Identity Provider (IdP - Nhà cung cấp danh tính): Là nơi trực tiếp lưu trữ thông tin tài khoản (username/password) và thực hiện việc xác thực xem người dùng là ai. Trong ví dụ nãy giờ, Keycloak đang tự đóng vai trò là một IdP vì nó chứa tài khoản của Nam và Cô Lan.

  • Identity Brokering (Môi giới danh tính): Là tính năng Keycloak làm "cò mồi" trung gian. Thay vì bắt người dùng tạo mật khẩu mới, Keycloak hiển thị nút "Đăng nhập bằng Google". Khi người dùng bấm vào, Keycloak đẩy họ sang Google để xác thực, sau đó đón dữ liệu trả về và cho phép họ vào hệ thống.

Để hiểu sâu hơn về tính thực tiễn của khái niệm cuối cùng này, hãy thử suy nghĩ xem: Theo bạn, tại sao các dự án phần mềm hiện nay lại rất thích sử dụng tính năng Identity Brokering (cho phép đăng nhập qua Google, Facebook, GitHub) thay vì cứ bắt người dùng tạo một tài khoản mới tinh bằng email và mật khẩu trên hệ thống của họ?

Chúng ta cùng mổ xẻ lý do tại sao Identity Brokering lại trở thành "tiêu chuẩn vàng" của các phần mềm hiện đại, cũng như cách nó hoạt động ngầm bên dưới nhé.

Tại sao các hệ thống lại "nghiện" Identity Brokering? 🚀

Việc cho phép người dùng đăng nhập qua các IdP lớn (Google, Facebook, Apple) giải quyết hai bài toán cực kỳ lớn:

  • Trải nghiệm người dùng (UX) đột phá: Người dùng rất lười tạo tài khoản mới và cực kỳ ghét việc phải nhớ thêm một mật khẩu thứ n. Đăng nhập "1-chạm" giúp tăng tỷ lệ đăng ký thành công lên rất nhiều lần.

  • Ủy thác rủi ro bảo mật (Security): Đây là yếu tố quan trọng nhất đối với hệ thống. Khi người dùng đăng nhập bằng Google, hệ thống của bạn không hề lưu trữ mật khẩu của họ. Bạn nhường việc bảo vệ mật khẩu đó cho đội ngũ an ninh mạng hàng đầu thế giới của Google. Nếu database của bạn không may bị hacker tấn công, chúng cũng không thể lấy được mật khẩu của người dùng.

Mổ xẻ cơ chế hoạt động (Dòng chảy dữ liệu) 🔄

Hãy xem chuyện gì thực sự xảy ra khi một người dùng bấm vào nút "Đăng nhập bằng Google" trên trang web của bạn thông qua Keycloak:

  1. Chuyển hướng (Redirect): Ứng dụng của bạn đẩy người dùng đến Keycloak. Keycloak thấy yêu cầu đăng nhập Google liền lập tức chuyển hướng người dùng sang trang đăng nhập chính thức của Google.

  2. Xác thực tại nguồn: Người dùng nhập username/password trực tiếp trên trang của Google.

  3. Trả vé (Token): Nếu mật khẩu đúng, Google không gửi mật khẩu cho Keycloak. Thay vào đó, Google tạo ra một "tấm vé điện tử" (Token) chứa thông tin cơ bản (email, tên, ảnh đại diện) và ký xác nhận. Tấm vé này được ném về lại cho Keycloak.

  4. Tạo bản sao (Shadow User): Đây là bước mấu chốt của Keycloak. Khi nhận được vé từ Google lần đầu tiên, Keycloak sẽ tự động tạo một tài khoản "bản sao" (Shadow User) bên trong Realm của nó.

Tại sao phải tạo Shadow User? 👤

Bởi vì hệ thống phân quyền (Role và Group) của Keycloak chỉ có thể gắn vào một User nằm trong cơ sở dữ liệu của nó. Nhờ có Shadow User này, bạn mới có thể gom tài khoản Google của anh A vào Group "Nhân viên", hoặc gán Role "Quản trị viên" cho tài khoản Facebook của chị B.

Đến đây, chúng ta đã đi qua toàn bộ 4 khái niệm "xương sống" (Realm, Client, Role/Group, IdP). Để tổng hợp lại kiến thức về kiến trúc bảo mật này, hãy cùng suy luận một tình huống thực tế cuối cùng:

Giả sử bạn đang thiết kế kiến trúc bảo mật cho hệ thống lưu trữ tài liệu nội bộ tuyệt mật của một ngân hàng. Theo bạn, chúng ta có nên tích hợp Identity Brokering để cho phép nhân viên ngân hàng đăng nhập bằng tài khoản Google/Facebook cá nhân của họ không? Tại sao?

Câu trả lời là: KHÔNG. ❌ Tuyệt đối không nên tích hợp Google/Facebook (Identity Brokering qua mạng xã hội) cho hệ thống tài liệu mật nội bộ.

Dưới đây là 3 lý do cốt lõi để giải thích tại sao:

  1. Mất quyền kiểm soát vòng đời nhân sự (Lifecycle Management): 🔄 Khi một nhân viên nghỉ việc, bộ phận IT ngân hàng sẽ ngay lập tức khóa tài khoản nội bộ của người đó. Tuy nhiên, ngân hàng không thể khóa tài khoản Gmail hay Facebook cá nhân của họ. Nếu sử dụng IdP công cộng, cựu nhân viên vẫn nắm giữ chìa khóa xác thực ở phía Google, và nếu quản trị viên quên xóa "Shadow User" trong Keycloak, rò rỉ dữ liệu sẽ xảy ra.

  2. Không đáp ứng tiêu chuẩn bảo mật (Security Compliance): 🛡️ Ngân hàng có các quy định tuân thủ bảo mật rất khắt khe (ví dụ: bắt buộc đổi mật khẩu 90 ngày/lần, cấm dùng mật khẩu cũ, sử dụng hệ thống khóa bảo mật phần cứng riêng). Nếu ủy thác việc xác thực cho Google/Facebook, ngân hàng sẽ hoàn toàn "bó tay", không thể ép buộc các chính sách này lên tài khoản cá nhân của nhân viên.

  3. Sai tệp người dùng: 👥 Chức năng đăng nhập qua mạng xã hội sinh ra để phục vụ khách hàng đại chúng (B2C) nhằm giảm rào cản đăng ký. Đối với nhân viên nội bộ (B2E), họ bắt buộc phải sử dụng định danh do chính doanh nghiệp cấp.

Trong thực tế ở bài toán này, ngân hàng vẫn có thể dùng Identity Brokering, nhưng họ sẽ liên kết Keycloak với hệ thống quản lý nhân sự nội bộ của họ (như Microsoft Active Directory), chứ không phải các dịch vụ công cộng.

Phần III: Authentication (Xác thực) - OIDC & Luồng đi của Token

1. Standard Flow (Authorization Code Flow) 🔄

Đây là luồng tiêu chuẩn, an toàn và phổ biến nhất hiện nay dành cho các ứng dụng Web có Backend đi kèm, hoặc các ứng dụng Mobile.

Các bước hoạt động thực tế (Thường gọi là luồng 3 chân - 3-legged flow):

  1. Khởi tạo: Người dùng bấm "Đăng nhập" trên ứng dụng Frontend.

  2. Chuyển hướng (Redirect): Frontend không tự vẽ ra form đăng nhập mà chuyển hướng trình duyệt của người dùng sang trang đăng nhập của Keycloak.

  3. Xác thực: Người dùng nhập Username/Password trực tiếp trên Keycloak.

  4. Trả về Code: Keycloak xác thực thành công, sau đó chuyển hướng trình duyệt quay lại Frontend (thông qua một Redirect URI đã đăng ký trước), kèm theo một chuỗi ký tự ngắn hạn gọi là Authorization Code trên thanh URL.

  5. Ủy thác cho Backend: Frontend lấy mã Code này trên URL và gửi xuống Backend của bạn.

  6. Đổi Code lấy Token (Token Exchange): Backend mang mã Code này, cộng thêm Client ID và Client Secret (những thông tin bí mật được cất giữ an toàn ở server) gửi một request trực tiếp (server-to-server) đến Keycloak.

  7. Cấp phát: Keycloak kiểm tra hợp lệ và trả về các Token (Access Token, ID Token, Refresh Token) cho Backend.

Với luồng này, ứng dụng của bạn hoàn toàn không biết mật khẩu của người dùng là gì.

Để thực sự hiểu sâu về thiết kế của giao thức này, chúng mình hãy thảo luận một chút: Nhìn vào các bước trên, tại sao Keycloak lại trả về một "Authorization Code" ở bước 4 để rồi Backend phải mất công đi đổi lấy Token ở bước 6? Tại sao Keycloak không trả thẳng Access Token về cho Frontend luôn cho nhanh chóng? Theo bạn, việc dùng "Code" làm bước đệm giải quyết rủi ro bảo mật nào? 🔑

Chúng ta cùng giải mã bí mật này nhé. Mấu chốt nằm ở sự khác biệt giữa môi trường Front-channel (Trình duyệt của người dùng) và Back-channel (Máy chủ/Backend).

Nếu Keycloak trả thẳng Access Token về Frontend thông qua thanh URL (Front-channel), Token này rất dễ bị lộ. Lịch sử duyệt web, các tiện ích mở rộng (extensions) độc hại trên trình duyệt, hoặc thậm chí ai đó nhìn trộm màn hình đều có thể chộp được Access Token và mạo danh người dùng hoàn toàn.

Thay vào đó, việc dùng Authorization Code tạo ra một bước đệm an toàn:

  • Mã Code có thời hạn rất ngắn và chỉ dùng được một lần.

  • Quan trọng nhất: Kẻ gian dù có trộm được Code trên trình duyệt cũng vô dụng, vì để đổi Code lấy Token, bắt buộc phải có Client Secret (mật khẩu của ứng dụng). Chìa khóa Client Secret này được giấu cực kỳ an toàn ở Backend.

  • Cuộc trao đổi "Code lấy Token" diễn ra trực tiếp giữa Backend và Keycloak (Back-channel), hoàn toàn vô hình với trình duyệt.

Đó là lý do Authorization Code Flow hiện là tiêu chuẩn vàng cho các ứng dụng web! 🥇

2. Direct Access Grants (luồng Resource Owner Password Credentials - ROPC)

Luồng này hoạt động rất "thẳng ruột ngựa": Ứng dụng của bạn tự vẽ ra form đăng nhập ➔ Người dùng nhập Username và Password ➔ Ứng dụng cầm thẳng Username/Password này gửi cho Keycloak để xin cấp Token.

Hiện nay, các tiêu chuẩn bảo mật hiện đại đã khuyến cáo hạn chế tối đa luồng này, thường chỉ dành cho các hệ thống cũ (legacy) không thể sửa code, hoặc các công cụ dòng lệnh (CLI).

Theo bạn, việc ứng dụng của chúng ta được phép "cầm nắm" trực tiếp Username và Password của người dùng (thay vì chuyển hướng họ sang trang đăng nhập của Keycloak như luồng Standard) sẽ mang lại những rủi ro bảo mật nào cho hệ thống? 🕵️‍♂️

Chúng ta cùng bóc tách ngay những rủi ro chí mạng của luồng Direct Access Grants (ROPC) nhé. Khi ứng dụng tự vẽ form và "cầm nắm" trực tiếp mật khẩu của người dùng, hệ thống sẽ đối mặt với 3 lỗ hổng lớn:

  1. Mất điểm kiểm soát trung tâm (Vấn đề niềm tin): Người dùng buộc phải tin tưởng tuyệt đối vào ứng dụng. Nếu ứng dụng này bị hacker tấn công, hoặc lập trình viên lén lưu lại mật khẩu (log lại file), tài khoản Keycloak của người dùng sẽ bị lộ hoàn toàn 🔓.

  2. Không thể xác thực đa yếu tố (MFA): Vì người dùng không được chuyển hướng đến trang web của Keycloak, hệ thống rất khó triển khai các bước bảo mật nâng cao như gửi mã OTP qua SMS, Authenticator app, hoặc dùng khóa vật lý (WebAuthn/Yubikey).

  3. Phá vỡ Single Sign-On (SSO): OIDC sinh ra để người dùng đăng nhập một lần và dùng được mọi app. Nhưng với ROPC, vì không có phiên đăng nhập (session cookie) nào được tạo ra trên trình duyệt tại domain của Keycloak, người dùng cứ sang app khác là lại phải gõ mật khẩu lại từ đầu.

Đó là lý do các tiêu chuẩn bảo mật mới nhất (như OAuth 2.1) đã chính thức loại bỏ luồng này. Nó chỉ còn tồn tại như một giải pháp "chữa cháy" cho các hệ thống cũ hoặc các công cụ dòng lệnh (CLI) chạy ngầm.

3. Client Credentials Grant 🤖

Đây là luồng sinh ra dành riêng cho giao tiếp Server-to-Server (Backend nói chuyện với Backend). Giả sử bạn có Service_A cần gọi một API bảo mật của Service_B. Trong trường hợp này, hoàn toàn không có sự tham gia của người dùng (không có màn hình, không có trình duyệt).

Vậy theo bạn, nếu không có Username hay Password của người dùng, Service_A sẽ dùng thông tin gì để chứng minh danh tính của nó với Keycloak nhằm xin cấp Access Token?

Với luồng Client Credentials Grant (Server-to-Server), vì không có người dùng, Keycloak sẽ coi bản thân Service_A chính là một "người dùng đặc biệt" (Machine-to-Machine).

Thay vì Username/Password, Service_A sẽ dùng Client ID và Client Secret của chính nó để gửi yêu cầu đến Keycloak. Bạn có thể hình dung giống như hai công ty giao dịch với nhau, họ không cần biết nhân viên nào đang thao tác, họ chỉ cần "Giấy phép kinh doanh" (Client ID) và "Chữ ký mật" (Client Secret) của hệ thống kia là đủ để cấp quyền truy cập (Access Token).

4. Giải phẫu Token (JWT) 🧬

Khi Keycloak cấp phát thành công, nó thường trả về một bộ 3 Token (được định dạng theo chuẩn JWT - JSON Web Token). Hãy mổ xẻ vai trò của từng loại:

4.1. Bộ ba Token

  • ID Token (Chứng minh nhân dân): Chứa thông tin để trả lời câu hỏi "Bạn là ai?" (Tên, email, ảnh đại diện...). Token này sinh ra chỉ để cho Frontend đọc nhằm hiển thị giao diện (ví dụ: góc phải màn hình hiện chữ "Xin chào, Tuấn").

  • Access Token (Thẻ từ khách sạn): Trả lời câu hỏi "Bạn được phép làm gì?". Frontend không cần đọc cái này, mà chỉ dùng nó để đính kèm vào Header gửi xuống Backend. Backend sẽ kiểm tra Access Token để quyết định xem có cho phép bạn gọi API hay không.

  • Refresh Token (Chìa khóa dự phòng): Access Token thường có tuổi thọ rất ngắn (ví dụ 5-15 phút) để lỡ bị lộ thì rủi ro thấp. Khi Access Token hết hạn, hệ thống ngầm dùng Refresh Token để xin Keycloak cấp Access Token mới mà không bắt người dùng phải gõ lại mật khẩu.

4.2. Token Claims và Mappers:

Bên trong (Payload) của một JWT chứa các cặp key-value, mỗi cặp này gọi là một Claim (Lời tuyên bố). Ví dụ: "email": "admin@congty.com", "role": "manager".

Mappers trong Keycloak chính là công cụ để bạn "nhào nặn" các Claim này. Ví dụ: Mặc định Keycloak không bỏ số điện thoại của người dùng vào Access Token. Bạn có thể vào Keycloak, tạo một Mapper quy định rằng: "Hãy lấy trường 'Phone' trong Database của user, gắn thành một claim tên là 'sdt', và nhét nó vào trong Access Token". Nhờ đó, Backend của bạn sẽ nhận được thông tin custom này.

Dựa vào sự khác biệt giữa các Token, bạn thử nghĩ xem: Tại sao giao thức OIDC lại phải tách biệt ID Token và Access Token? Nếu chúng ta gộp chung cả thông tin "người dùng là ai" (giao diện) và "quyền hạn API" vào một Token duy nhất thì sẽ phát sinh vấn đề gì?

Chúng ta sẽ cùng giải đáp câu hỏi này ngay nhé! Việc OIDC quyết định tách biệt rạch ròi ID Token và Access Token (thay vì gộp chung thành một Token khổng lồ) là một thiết kế rất thông minh vì 3 lý do chính sau:

  • 📦 1. Kích thước và Hiệu suất (Performance)

    • Access Token là thứ sẽ được đính kèm vào mọi yêu cầu (request) gửi từ Frontend xuống Backend. Nếu chúng ta nhét tất cả thông tin hồ sơ người dùng (tên đầy đủ, ngày sinh, URL ảnh đại diện...) vào Access Token, kích thước của nó sẽ phình to rất nhanh. Việc gửi một cục dữ liệu lớn qua lại liên tục sẽ tiêu tốn băng thông mạng và làm chậm tốc độ phản hồi của API.
  • 🎯 2. Đúng người, đúng việc (Audience): Mỗi Token có một "đối tượng độc giả" khác nhau:

    • ID Token dành cho Frontend (để vẽ giao diện).
    • Access Token dành cho Backend (để kiểm tra quyền hạn). Backend API thường không cần quan tâm ảnh đại diện hay sở thích của người dùng là gì; nó chỉ cần biết "Người dùng có ID này có quyền xóa bài viết không?". Việc tách biệt giúp bảo vệ dữ liệu riêng tư: Backend chỉ nhận được các quyền hạn (claims) nó cần, và Frontend không cần giữ hay đọc những thông tin phân quyền nhạy cảm của API.
  • 🔒 3. Vòng đời và Bảo mật (Lifecycle & Security)

    • Bằng cách tách riêng, hệ thống có thể thiết lập các chính sách bảo mật khác nhau. Ví dụ, ID Token có thể có thời hạn dài hơn một chút để người dùng không bị mất giao diện, trong khi Access Token lại có thời hạn cực ngắn (ví dụ 5 phút) để nếu bị tin tặc đánh cắp trên đường truyền mạng thì hậu quả cũng bị hạn chế tối đa.

Phần IV: Authorization (Ủy quyền) - Không chỉ là Role

1. RBAC (Role-Based Access Control) 🛡️

Chúng ta sẽ bắt đầu với RBAC (Role-Based Access Control) 🛡️, nền tảng cơ bản nhất của việc quản lý truy cập. Trong mô hình RBAC, quyền truy cập không được cấp trực tiếp cho từng người dùng riêng lẻ. Thay vào đó:

  • Quyền được gán cho các Role (Vai trò).
  • Người dùng được gán một hoặc nhiều Role.

Bạn có thể hình dung nó giống như thẻ nhân viên trong một tòa nhà 🏢. Tòa nhà không cần biết bạn tên là gì, họ chỉ cần nhìn vào loại thẻ của bạn:

  • Thẻ Nhân viên (Role user): Chỉ mở được cửa văn phòng chung.
  • Thẻ Quản lý (Role manager): Mở được phòng họp riêng.
  • Thẻ Bảo vệ (Role admin): Có chìa khóa chủ mở mọi cánh cửa.

Trong Keycloak, RBAC được thể hiện rất rõ ràng thông qua hai cấp độ:

  • Realm Roles: Vai trò có tác dụng trên toàn bộ hệ thống (Realm) chứa các ứng dụng của bạn.
  • Client Roles: Vai trò chỉ có tác dụng trong một ứng dụng cụ thể (Client).

RBAC rất dễ hiểu và dễ triển khai, nhưng nó có một điểm yếu khi hệ thống phức tạp lên.

2. ABAC (Attribute-Based Access Control) & CBAC (Context-Based Access Control)

Để hiểu tại sao chúng ta cần đến các mô hình cao cấp hơn như ABAC hay CBAC, hãy thử xem xét tình huống này: Giả sử chúng ta có một hệ thống lưu trữ tài liệu. Cả bạn và tôi đều được gán chung một role là nhan_vien. Tuy nhiên, quy định của công ty là: Ai tạo ra tài liệu nào thì chỉ người đó mới được phép chỉnh sửa tài liệu của chính mình.

Theo bạn, nếu chỉ sử dụng mô hình RBAC với các role tĩnh như nhan_vien, chúng ta có thể dễ dàng giải quyết được quy định này không? Tại sao?

Câu trả lời là không, RBAC truyền thống sẽ rất chật vật trong trường hợp này.

Tại sao RBAC lại gặp khó?

Vì RBAC chỉ quan tâm đến danh tính chung (bạn có role nhan_vien). Nó không hiểu được mối quan hệ giữa bạn và tài liệu đó. Nếu cố dùng RBAC, chúng ta phải tạo ra hàng ngàn role như chu_so_huu_tai_lieu_1, chu_so_huu_tai_lieu_2... Việc này dẫn đến hiện tượng Role Explosion (bùng nổ role), hệ thống sẽ phình to và không thể quản lý nổi.

Đây chính là lúc chúng ta bước sang ABACCBAC 🧩 để thiết lập các chính sách phân quyền "động".

1. ABAC (Attribute-Based Access Control - Phân quyền dựa trên thuộc tính)

Thay vì đóng khung vào Role, ABAC linh hoạt xét các thuộc tính của:

  • Người dùng (User): Tuổi, phòng ban, vị trí công tác...
  • Tài nguyên (Resource): Tên người tạo, mức độ bảo mật của tài liệu...
  • Hành động (Action): Đọc (read), sửa (write), xóa (delete)...

Cách giải quyết bài toán tài liệu: Trong Keycloak, chúng ta chỉ cần tạo một chính sách (policy) đánh giá thuộc tính: Cho phép sửa NẾU (Tên_người_dùng == Người_tạo_tài_liệu). Hệ thống sẽ tự động so sánh động mỗi khi có yêu cầu truy cập.

2. CBAC (Context-Based Access Control - Phân quyền dựa trên ngữ cảnh)

CBAC xét đến môi trường xung quanh lúc người dùng yêu cầu truy cập:

  • Thời gian: Chỉ cho phép truy cập hệ thống từ 8h sáng đến 5h chiều.
  • Vị trí mạng (IP): Chỉ cho phép tải dữ liệu khi dùng Wifi nội bộ công ty.
  • Thiết bị: Hạn chế quyền nếu đăng nhập từ thiết bị di động.

Trong Keycloak, bạn có thể kết hợp tất cả các mô hình này lại với nhau (Aggregated Policies) để tạo ra các quy tắc bảo mật cực kỳ chặt chẽ.

Bây giờ, hãy thử phân tích một quy định bảo mật thực tế: "Giao dịch trên 1 tỷ đồng chỉ được duyệt bởi người có vai trò 'Giám đốc' VÀ người đó phải đang thực hiện thao tác từ mạng nội bộ (IP) của ngân hàng."

Theo bạn, quy định này đang kết hợp những mô hình phân quyền nào trong số RBAC, ABAC và CBAC mà chúng ta vừa thảo luận?

Chúng ta cùng phân tích chi tiết quy định này nhé. Quy định này thực chất là sự kết hợp của cả 3 mô hình:

  • 🛡️ "Vai trò 'Giám đốc'" (RBAC): Hệ thống kiểm tra xem tài khoản người dùng có chứa Role là Giám đốc hay không.
  • 🧩 "Giao dịch trên 1 tỷ đồng" (ABAC): Hệ thống đánh giá thuộc tính của tài nguyên/hành động (số tiền giao dịch).
  • 🧩 "Mạng nội bộ (IP của ngân hàng)" (CBAC): Hệ thống kiểm tra ngữ cảnh môi trường tại thời điểm thực hiện thao tác. Dù là Giám đốc nhưng nếu đang dùng Wifi ở quán cà phê (IP lạ), lệnh duyệt cũng sẽ bị từ chối.

Trong Keycloak, tính năng này gọi là Aggregated Policies (Chính sách tổng hợp). Bạn có thể gộp các chính sách nhỏ lại bằng toán tử AND (phải thỏa mãn tất cả) hoặc OR (chỉ cần thỏa mãn một điều kiện).

3. UMA (User-Managed Access - Quyền truy cập do người dùng tự quản lý)

Bây giờ, chúng ta sẽ bước sang mảnh ghép cuối cùng và cốt lõi nhất của Keycloak Authorization Services: 🤝 UMA (User-Managed Access - Quyền truy cập do người dùng tự quản lý).

Ở các mô hình RBAC, ABAC hay CBAC, Quản trị viên (Admin) hoặc Lập trình viên là người viết ra các quy tắc phân quyền. Nhưng với UMA, chính người dùng (User) mới là người quyết định ai được phép làm gì với tài sản kỹ thuật số của họ.

Hãy lấy ví dụ về Google Drive: Khi bạn tải lên một tài liệu, bạn có thể bấm nút "Share" (Chia sẻ), nhập email của đồng nghiệp và cấp cho họ quyền "Đọc" hoặc "Chỉnh sửa". Bạn tự làm điều đó mà không cần phải nhờ Admin hệ thống can thiệp. Đó chính là UMA.

Theo bạn, để Keycloak cho phép bạn (một người dùng bình thường) tự cấp quyền cho người khác trên một tài liệu, thì khi tài liệu đó được tạo ra, hệ thống bắt buộc phải ghi nhận lại thông tin quan trọng nào?

Câu trả lời chính là : Chủ sở hữu tài nguyên (Resource Owner)

Trong kiến trúc của Keycloak và chuẩn UMA, mọi thứ diễn ra theo một quy trình rất chặt chẽ như sau:

  1. Đăng ký tài nguyên (Resource Registration): Khi bạn tạo một tài liệu mới trên ứng dụng, ứng dụng sẽ gọi một API đặc biệt của Keycloak (gọi là Protection API).

  2. Gắn quyền sở hữu: Ứng dụng báo cho Keycloak biết: "Hãy tạo một Tài nguyên (Resource) mới tên là 'Tài_liệu_của_tôi', và gán ID của người dùng này làm Chủ sở hữu (Owner)."

  3. Quản lý tập trung: Nhờ có bản ghi này, Keycloak hiểu rằng bạn là "sếp" của tài liệu đó. Keycloak thậm chí cung cấp sẵn một giao diện cho người dùng gọi là Account Console (Trang quản lý tài khoản). Tại đây, trong mục My Resources, bạn có thể xem tất cả tài liệu mình sở hữu, cấp quyền (Share) cho người khác, hoặc thu hồi quyền bất cứ lúc nào.

Như vậy, ứng dụng của bạn không cần phải tự xây dựng tính năng "Chia sẻ" phức tạp nữa, Keycloak đã lo liệu toàn bộ logic đó thông qua UMA.

Bây giờ, chúng ta hãy hình dung kịch bản này: Đồng nghiệp của bạn (người chưa được cấp quyền) bấm vào đường link dẫn đến tài liệu riêng tư của bạn.

Theo bạn, thay vì chỉ hiển thị một dòng chữ "Lỗi 403: Cấm truy cập" khô khan, hệ thống UMA của Keycloak sẽ xử lý tình huống này tiếp theo như thế nào để đồng nghiệp của bạn có thể "xin phép" bạn?

Để mình giải thích chi tiết quá trình này nhé. Thay vì "sập cửa" ngay lập tức bằng lỗi 403, hệ thống UMA trong Keycloak sẽ kích hoạt một quy trình xin phép rất thông minh gồm các bước sau:

  • 🎫 Tạo "vé xin quyền" (Permission Ticket): Ngay khi phát hiện đồng nghiệp của bạn chưa có quyền, ứng dụng sẽ báo với Keycloak. Keycloak lập tức tạo ra một "Permission Ticket" ngầm đại diện cho nỗ lực truy cập này.

  • 🙋 Gửi yêu cầu truy cập (Request Access): Dựa vào chiếc vé trên, ứng dụng có thể hiển thị một giao diện thân thiện thay vì màn hình báo lỗi. Nó sẽ hiện nút "Yêu cầu quyền truy cập" (giống như trên Google Drive), cho phép đồng nghiệp nhập lời nhắn: "Cấp quyền cho mình xem báo cáo này với nhé".

  • ✅ Chủ sở hữu phê duyệt (Owner Approval): Yêu cầu xin quyền sẽ lập tức xuất hiện trong trang Quản lý tài khoản (Account Console) của bạn. Với tư cách là chủ sở hữu, bạn có toàn quyền bấm Phê duyệt (Approve) hoặc Từ chối (Deny).

  • 🔑 Cấp "thẻ thông hành" (RPT Token): Nếu bạn bấm phê duyệt, Keycloak sẽ phát hành cho đồng nghiệp một loại token đặc biệt gọi là RPT (Requesting Party Token). Chiếc thẻ thông hành này chứa chính xác quyền mà bạn vừa cấp, giúp họ mở được tài liệu.

Toàn bộ quy trình này diễn ra trơn tru mà Quản trị viên (Admin) của hệ thống không hề phải can thiệp hay viết thêm một dòng code nào!

Tạm kết

Khép lại Phần 1, chúng ta đã cùng nhau nhìn nhận lại "nỗi đau" kinh điển của mọi Backend Developer khi phải đối mặt với bài toán xác thực và phân quyền. Việc cố gắng tự xây dựng một hệ thống Authentication & Authorization từ đầu không chỉ tiêu tốn tài nguyên bảo trì mà còn tiềm ẩn vô vàn rủi ro về bảo mật và khả năng mở rộng.

Keycloak xuất hiện như một "vị cứu tinh" hoàn hảo – một Identity Provider (IdP) độc lập cung cấp giải pháp IAM và SSO chuẩn công nghiệp. Bằng cách ủy quyền và tách bạch hoàn toàn lớp bảo mật ra khỏi business logic, Keycloak giúp đội ngũ phát triển giải phóng thời gian, an tâm tập trung vào việc kiến tạo những tính năng cốt lõi sinh ra doanh thu thay vì phải đi "phát minh lại chiếc bánh xe".

Tuy nhiên, việc nắm vững bức tranh tổng quan kiến trúc mới chỉ là bước khởi động. Khi đã hiểu rõ "Tại sao lại chọn Keycloak?", câu hỏi lớn tiếp theo sẽ là "Làm thế nào để thuần phục nó?".

Trong Phần 2 của series "Keycloak toàn tập", chúng ta sẽ chính thức xắn tay áo bước vào thực chiến. Bài viết tới sẽ đi sâu bóc tách các khái niệm cốt lõi bên trong Keycloak (như Realm, Client, Role, User), mổ xẻ luồng hoạt động chi tiết của các giao thức chuẩn như OAuth 2.0 / OpenID Connect, và cách tích hợp Keycloak vào service Backend của bạn một cách trơn tru nhất.

Hãy nhấn theo dõi để không bỏ lỡ những "mảnh ghép" quan trọng tiếp theo! Nếu có bất kỳ thắc mắc nào về kiến trúc tổng quan hoặc kinh nghiệm triển khai thực tế, đừng ngần ngại để lại bình luận để chúng ta cùng thảo luận nhé. Hẹn gặp lại các bạn ở Phần 2!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí