1. 程式人生 > >Keycloak獲取Token示例及遇到的坑

Keycloak獲取Token示例及遇到的坑

一張圖,同事提供的,比較清晰的解釋了Keycloak的整體結構
Keycloak結構
Keycloak最頂層是基於realm的,可以理解為領域,名稱空間等。每個realm之間沒有任何關係,屬於相互獨立的兩個系統。Client對應具體的應用,比如每一個微服務就是一個Client。
對於Keycloak的所有操作都要經過認證,包括訪問REST介面,沒有攜帶有效token的話會報401未授權。獲取Token主要有兩種方式,一是賬號+密碼,二是clientid+secret,下面舉兩個例子。


使用者名稱+密碼
此種方式獲取到的token是使用者的token。
POST: ip:port/auth/realms/icp

/protocol/openid-connect/token
加粗標記為需要修改的部分
Header
這裡寫圖片描述
Body
這裡寫圖片描述
一些解釋:
此方式下,body中grant_type必須為password表明認證方式,其餘三項可根據實際情況進行修改。返回資訊如下
這裡寫圖片描述
token_type表示當前token的型別,後續使用此token進行其它操作時(如建立使用者)務必帶上此值。


clientid+secret
此種方式獲取到的token屬於client,即應用的token,此種方式通常用於註冊使用者時,預先獲取訪問keycloak的許可權,然後呼叫建立使用者的api。
secret可在此獲取
這裡寫圖片描述


如果這裡沒有secret,檢查對應client中settings選項卡Access Type的值是否為confidential,如下圖。
這裡寫圖片描述
URL及Header同第一種方式,只有Body部分不一樣。
這裡寫圖片描述
grant_type需要做對應修改。
如果返回401,檢查settings頁面Service Accounts Enabled開關是否開啟。


2018-09-14 09:49:56 更新
URL規則是這樣的:/auth/realms/{realms}/protocol/{協議型別}/token
protocol的型別可以在client的設定首頁檢視


下面說一下遇到的坑
在Keycloak官方文件上,關於介面的字首是這麼寫的
這裡寫圖片描述


然而如果按照文件上寫的話一定是各種404和401錯誤,正確寫法是這樣的
/auth/realms/{realm}
建立使用者等管理類操作是這樣的
/auth/admin/realms/{realm}


感謝http://huangqiqing123.iteye.com/