在上一節(jié)中,介紹了Keycloak的一些基本概念,從這一節(jié)開(kāi)始,我們一起來(lái)實(shí)操一下。整個(gè)流程大致分為如下幾步,并分布在Keycloak的系列章節(jié)中:
- 客戶端之間訪問(wèn)Keycloak,通過(guò)預(yù)先設(shè)置好的用戶名和密碼換取token;
- 了解Spring Security,使用spring security的kecloak adapter將Keycloak集成進(jìn)入spring,來(lái)保護(hù)一些endpoint;
- 通過(guò)Restful API在Keycloak中注冊(cè)新用戶;
- 如何使用Keycloak的multi-factor認(rèn)證
- 使用Keycloak來(lái)集成三方登錄;
安裝啟動(dòng)
這一部分可以按照官方教程一步一步做就好:
從Keycloak下載Standalone server distribution的壓縮包(當(dāng)然也可以選擇docker版本安裝運(yùn)行),解壓后,在bin目錄下執(zhí)行./standalone.sh。該服務(wù)將啟動(dòng)在8080端口,不出意外的話,運(yùn)行命令后可以直接訪問(wèn) http://localhost:8080/auth,頁(yè)面會(huì)提示去配置初始的管理員用戶名和密碼。
配置Realm
默認(rèn)情況下,通過(guò)管理員身份登錄后進(jìn)入的realm為Master,client,user等信息不應(yīng)該添加在Master這個(gè)realm中,添加新的realm更方便于后期的管理維護(hù)。添加方式如下圖所示:

添加Client
接下來(lái),添加一個(gè)client。一個(gè)client為Keycloak保護(hù)的一個(gè)server,在微服務(wù)架構(gòu)下一個(gè)client就可以是一個(gè)client。切換到上一步創(chuàng)建好的realm,在右側(cè)的菜單中選中Clients,再點(diǎn)擊Create:

填寫(xiě)一個(gè)Client ID,其余可以保持默認(rèn)值即可。
添加測(cè)試用戶
如下圖所示,菜單欄中選中Users,再點(diǎn)擊Add user,如下圖所示:

在表單內(nèi)填入用戶名,點(diǎn)擊保存:

會(huì)進(jìn)入用戶詳情的配置頁(yè)面,選中Credentials,進(jìn)入配置密碼的Tab,輸入密碼,同時(shí)關(guān)閉Temporary。Temporary通常用于管理添加用戶后,給用戶配置一個(gè)臨時(shí)密碼,當(dāng)用戶以用戶名和這個(gè)臨時(shí)密碼登錄時(shí),會(huì)提示用戶重置為自己的密碼。
但此處的目的是通過(guò)Postman直接通過(guò)向Keycloak發(fā)送請(qǐng)求獲取token,所以先關(guān)閉到Temporary這個(gè)開(kāi)關(guān)。

通過(guò)Postman測(cè)試
到這里為止,Keycloak的最基本配置已經(jīng)完成,使用Postman來(lái)測(cè)試一下,url為 http://localhost:8080/auth/realms/foodie/protocol/openid-connect/token,path中realms之后的字符串foodie就是剛剛新增的realm。其余信息可參考下圖:

通過(guò)該請(qǐng)求可獲取token,格式如下所示:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJwbkpFanJSUWg1R2s1R3hVUm5HZldvY1hEYV9STERUYk93Ny1jMk00RjlNIn0.eyJqdGkiOiJkYzZiZjMxOC04YTliLTRlMTYtYTU3Ni0wN2ViZWVkNTk5MjQiLCJleHAiOjE1NzY5ODI0MjMsIm5iZiI6MCwiaWF0IjoxNTc2OTgyMTIzLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvZm9vZGllIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjA2N2E4NmIzLWE4ZDktNGE5OC05YzJhLTQxMDZkODFlNzhiNiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImZvb2RpZSIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6ImIyNGZkM2RlLTA0YWQtNDFjMi05YjI1LWY2NTM2ZjhmYWRmNyIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoidXNlcjEifQ.Q_VYHdszBcBRHXStUgEe95qy425BUVlXzk1kMdEx0Py40Aulvpbn-koXX_5s53jFDCEqNJXIADjRUvr-2T3rH9PVvuCeUdJMmKBjXjTbZqwrHucb55MtJDJ9QujB6J5DHKSSCNMlXIqjZ1xU5znIX4LuViYsjgfsA5p0R4_1Wtx8jddhq1nsDsAKUWpapTAO-PgjvHBF6OAAEl9gf2kjv9ssOWhVZ1V0_Ik_n6ASQWSa57utIvqYPxvin4HgUmN3X-7rsuXb0WeCOMScrhy6Ba-xG8UT-nkBXEy73wh3B7rbcaTciVA6QLgcq-pAbTMlouiJc2ukaeSdfyw9kge5pA",
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0MzlmYWRhMS05MWY5LTRiYmEtYjViYi1mN2FlYzc1YTVhNTEifQ.eyJqdGkiOiI0ZDU3NzBlYS1jYzIyLTRlN2QtYjQyNC05NGM5MGFhNDVlYTEiLCJleHAiOjE1NzY5ODM5MjMsIm5iZiI6MCwiaWF0IjoxNTc2OTgyMTIzLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvZm9vZGllIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL2Zvb2RpZSIsInN1YiI6IjA2N2E4NmIzLWE4ZDktNGE5OC05YzJhLTQxMDZkODFlNzhiNiIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJmb29kaWUiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiJiMjRmZDNkZS0wNGFkLTQxYzItOWIyNS1mNjUzNmY4ZmFkZjciLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSJ9.IGu_ZfV2N9euHutVWTKj-GPcbz1a5ws2Ob7yYWuWwpM",
"token_type": "bearer",
"not-before-policy": 0,
"session_state": "b24fd3de-04ad-41c2-9b25-f6536f8fadf7",
"scope": "email profile"
}
此處的access_token和refresh_token均為JWT格式,可以使用jwt.io查看其中的信息。