在雲原生環境中,服務間的單點登入 (Single Sign-On) 能夠保持跨服務驗證的一致性。Quarkus Security 為開發者提供了多套系統結構與身份驗證的方式,包括 OIDC, OAuth2, JWT, LDAP。接下來會選用 OIDC 整合為今天的範例說明,Quarkus OIDC 也直接支援主流的提供商 - apple, facebook, github, google, microsoft...,關於 OIDC 原理滿多文章可以參考,例如今年鐵人賽的 OpenID Connect 協定簡介
KeyCloak 是紅帽開源的 SSO 系統,與 Quarkus 是系出同門,甚至在 KeyClock v17 時是直接的把 Application Server 從 Wildfly 換成 Quarkus (我的 Quarkus 驗證了你的 Quarkus ?)
在本地開發 Quarkus 時,需要 OIDC 服務 Dev Service 也會自動幫你起一個 KeyCloak,真貼心
quarkus extension add 'oidc'
這個會在 pom.xml 新增以下 dependency
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc</artifactId>
</dependency>
Quarkus 發現有 oidc dependency, 但是沒有設定 oidc server url , dev mode會自動起一個 Keycloak, 這裡需要引入一個 realm-path=quarkus-realm.json 在啟動時加入一組 sample user
%prod.quarkus.oidc.auth-server-url=http://localhost:8180/realms/quarkus
quarkus.oidc.client-id=backend-service
quarkus.oidc.credentials.secret=secret
# Tell Dev Services for Keycloak to import the realm file
quarkus.keycloak.devservices.realm-path=quarkus-realm.json
直接從 github 取得 quarkus-realm.json,裡面會包涵 admin, alice , jdoe 這幾個 user.
在 shell cd 移動到 project/src/main/resources, 下載 quarkus-realm.json
wget https://raw.githubusercontent.com/quarkusio/quarkus-quickstarts/main/security-keycloak-authorization-quickstart/config/quarkus-realm.json
可以看到啟動了 Keycloak docker
http://localhost:8080/q/dev/io.quarkus.quarkus-oidc/provider
瀏覽器打開,可以看到 OIDC 的 dev ui
按那個登入的按鈕
可以進入登入頁 ,輸入 alice/alice
就可以看到登入成功有 Access Token 與 ID Token
Access Token 可以打開看看裡面的內容, 包涵了 username 以及 group 的資訊
今天很辛苦的(?)把 keycloak 架起來了,明天就來實作如何保護我們的endpoint 吧