---
# System prepended metadata

title: 'Keycloak '

---

# Keycloak 使用紀錄

近期在接觸Keycloak，Keycloak為實現SSO的一種解決方案工具，本篇會簡易紀錄Keycloak基本概念、設定及如何使用，最後帶入Sample實作。

在了解Keycloak前我們需要對於身分驗證與授權，還有SSO要有一定的認知。如果對於這兩個Part熟悉的，可以直接從第三章開始看。

## 一、關於身份驗證與授權

系統認證授權為功能環節很重要的第一部分，這部分關係到系統使用的安全性。身份驗證 (Authentication)為系統辨識使用者，而授權則是判定使用者是誰給予什麼使用權限。但更細節的來看，其實他會拆成四個區塊

1. Identification (身分識別) : 簡單來說就是讓系統知道你是誰，例如當您輸入用戶名或電子郵件地址登錄到某個系統時，您其實是在告訴該系統您是誰。

2. Authentication (身分驗證):  讓系統相信你是誰，例如當您輸入密碼、使用指紋、臉部識別或一次性密碼(如簡訊驗證碼)來登錄系統時，您其實是在讓系統相信您確實是該帳戶的持有者。

3. Authorization (授權) : 授權基本上就是種角色分配，一旦用戶被驗證成功，系統會根據用戶的身份分配特定的角色。例如你登入後，授權給你一個開發者角色，相對使用者角色，你可以有更多操作。

4. Access Control (存取控制) : 存取控制為角色可以使用哪些操作設定，假設有一個IT管理系統，系統內有各種資源和功能，包括伺服器管理、程式碼部署、日誌查看等。操作員與開發者權限上就有所不同。例如一般使用者可以重啟伺服器、監控系統健康狀態、查看系統日誌但無法直接更改或部署程式碼可是開發者就可以。

### 


## 二、SSO 簡述

> 透過單一的登入窗口，進行單一的身分驗證，就可以讓許多的服務共同來使用這個驗證結果

假設你在工作中使用三個不同的系統：

1. 郵件系統（Email System）
2. 公司內部網站（Intranet）
3. 報表和數據分析平台（Analytics Platform）

每個系統都需要不同的帳號和密碼。所以你得記住三組不同的登入資訊，並且每次要使用這些平台時都需要進行獨立的登入動作。

這時候 SSO（單一登入）就派上用場了。當你早上第一次來到辦公室，你只需要登入一個「統一的登入介面」，比如說，這個介面是由 Keycloak 管理的。你只需要輸入一組帳號密碼，透過Keycloak驗證身分，就可以自由地訪問三個系統，無須切換平台需要再次切換帳號與密碼。

簡單來說，SSO 是單點登入，能將多個不同的系統串接成單一入口，能減少不同系統都要各自驗證密碼的問題，減少密碼在各系統存放的短板問題，只要使用者通過一次身份驗證，就可以存取所有需要密碼驗證的服務。

簡易範例架構範例如下，

 - Step1(箭頭1) : 用者首先訪問「Application 01」的 URL 並按下登入按鈕，然後會被引導到 Keycloak 登入頁面。
 - Step2: 用戶在 Keycloak 成功登入後，將被重新導向回「Application 01」的主頁。
 - Step3(箭頭3): 如果用戶在合理的時間內再次訪問「Application 02」，則不需要重新登入。

箭頭2為當用戶訪問「Application 01」並嘗試登入時（箭頭1），他們將被引導到「KEYCLOAK」的登入頁面（箭頭2）。所以，是的，箭頭2表示用戶直接登入到「KEYCLOAK」這個認證伺服器。

![](https://hackmd.io/_uploads/HJ8nNK5-T.png)

## Keycloak

一個 OpenSource 方案，提供 SSO 功能，並支援包含 OAuth2, SAML 等協定，這次選用 SAML。

### 基本物件
Users: 使用者，使用並需要登入系統的物件

Roles: 用來對應權限

Clients: 客戶端，需要接入 Keycloak，並被Keycloak保護的應用和服務

Realms: 領域，領域管理著一批使用者、證照、角色、組等，**一個使用者只能屬於並且能登陸到一個域，域之間是互相獨立隔離的**， 一個域只能管理它下面所屬的使用者。

## 基本概念 - SAML
安全性聲明標記語言 (SAML) 是一種標準化方法，用於告訴外部應用程式和服務，使用者是他們所聲稱的身分用。從而使單一登入 (SSO) 技術成為可能。

SAML (安全聲明標記語言) 是應用程式用來與 SSO 服務交換身分驗證資訊的通訊協定。
使用 XML 來交換使用者識別資料。SAML 提供了一種方法，對使用者進行一次驗證，然後可將該驗證傳達給多個應用程式，應用程式不需要在其系統上儲存使用者憑證。
SAML 的最新版本是 SAML 2.0。

將 SAML 驗證視為一張身分證：一種顯示某人身分的簡短、標準化方法。譬如，不必進行一系列的 DNA 測試來確認一個人的身分，只需看一眼這個人的身分證便可。

**SAML驗證與使用者授權的差別**

- **驗證**是指使用者的身分
- **授權**是指使用者的權限

### IdP
識別提供者 (IdP) 儲存並管理使用者的數位身分，概念上就是個使用者清單，可以讓 SSO 來檢查使用者。

IdP 可以透過使用者名稱-密碼組合和其他因素檢查使用者身分，或者可能只是簡單地提供一個使用者身分清單，供另一個服務提供者（如：SSO）用來檢查使用者身分。

#### 使用者身份
可由電腦驗證身份的因子，只需要其中一種就可以做 IdP 驗證：

- 知道的內容：使用者的帳號密碼
- 擁有的物品：手機
- 生物特徵：指紋、視網膜

### IdP 如何與 SSO 搭配

在大多數情況下，SSO 和 IdP 是分開的。SSO 服務使用 IdP 檢查使用者身分，但它實際上並不儲存使用者身分。SSO 提供者在使用者登入時透過 IdP 檢查使用者身分。完成此操作后，SSO 可以向任意數量的已連接雲端應用程式驗證使用者身分。

**範例情境**

![](https://hackmd.io/_uploads/SyIvyd9ZT.png)

[節錄自 Cloudflare 參考](https://www.cloudflare.com/zh-tw/learning/access-management/what-is-an-identity-provider/)


外部參考

- [使用Docker建立基本環境](https://blog.miniasp.com/post/2023/04/21/Running-Keycloak-in-development-mode)
- [Keycloak refference 1](https://iter01.com/509140.html)
- [Keycloak refference 2](https://iter01.com/509140.html)
