Keycloak - 架設自己的SSO

透過keycloak能夠讓你快速擁有一個自己架設的OAuth伺服器,他是由RedHat開源維護的

Install

用docker架最快

docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:17.0.0 start-dev

Config

會有一些部份要設定

Authorization Services Guide

先去到admin console, http://localhost:8080/admin

Realm

預設的區域會是master,可以自己再設一個

User

要在對應的realm下設定新的user (一樣在admin page但要選對realm)

新增一個user後再去Credentials設定密碼,勾選temp可以避免登入就要求改密碼

Account Console

這個就會是user的介面而不是keycloak server的admin Ui

到account console去更進一步的設定使用者的資訊http://localhost:8080/realms/myrealm/account

Allow First App

要設定可以允許的clinet

Verify

可以透過keycloak的網頁程式做個快速驗證,要填入剛剛設定的clinet name

https://www.keycloak.org/app/

Endpoints

keycloak-documentation/oidc-generic.adoc at main · keycloak/keycloak-documentation

如果要查看有哪些endpoints或是設定

/realms/{realm-name}/.well-known/openid-configuration

Login

瀏覽器內沒有合法cookie的話會先跳登入

/realms/{realm-name}/protocol/openid-connect/connect

登入成功後會拿到以下的cookie

  • sessionId/ AUTH_SESSION_ID: 紀錄keycloak上對應的session id

Authorization

驗證權限

/realms/{realm-name}/protocol/openid-connect/auth

Token

透過瀏覽器帶的sessionId cookie去取得JWT token

這個token內有登入者的資訊

/realms/{realm-name}/protocol/openid-connect/token

User info

有token的話才能取得user的資訊

/realms/{realm-name}/protocol/openid-connect/userinfo

Logout

如果想要登出的話必須要告訴keycloak server要清空session

/realms/{realm-name}/protocol/openid-connect/logout

Demo Client

git clone https://github.com/keycloak/keycloak-quickstarts
cd keycloak-quickstarts/app-authz-jee-vanilla

如果想要使用java或是node.js的現成app來測試,可以去官方repo找

Postman

實際上在用postman登入時,由於用的是OAuth2所以會用到token endpoint

必須填上user, password, clinet跟grant_type

送出request之後就會拿到一長串的access token

這個access token就是JWT token,可以直接到jwt官網decode


或是你也可以選擇另外一種取得access token的方式

直接在postman選擇OAuth 2.0

設定好後就能選擇送出並取得access token

這種方式要在clinet的setting下加入postman的callback