keycloak~網站對接到Keycloak的步驟

张占岭發表於2024-04-08

新網站對接到KC的部署

  1. kc的環境
  2. 向kc申請自己的客戶端
  3. kc的登入介面
  4. 透過code換token介面
  5. 重新整理token介面
  6. kc的使用者資訊介面
  7. kc的jwt token說明

1. kc的環境

測試環境:https://test-kc.xxx.com
預釋出環境:https://pre-kc.xxx.com
生產環境:https://kc.xxx.com

2. 向kc申請自己的客戶端

聯絡負責開發kc的同事,申請一個客戶端,需要提供以下資訊:

client_id: 客戶端id
client_secret: 客戶端密碼

3. kc的登入介面

  • /auth/realms/{realm}/protocol/openid-connect/auth?client_id=client_id&response_type=code&redirect_uri=redirect_uri

  • 引數說明:

client_id: 客戶端id
response_type: code
redirect_uri: 登入成功後的回撥地址

4. 透過code換token介面

當你把第3步地址複製到瀏覽器後,會重寫向到登入頁,輸入正確的使用者名稱和密碼後,提交後會重定向到來源頁,帶在地址上帶著code碼,這個code碼是用來換取token的。

  • /auth/realms/{realm}/protocol/openid-connect/token
  • 請求方式:POST
  • 請求引數:
client_id: 客戶端id
client_secret: 客戶端密碼
grant_type: authorization_code
code: 透過登入成功重寫向後地址上帶著的code
  • 返回引數:
{
    "access_token": "token",
    "expires_in": 1800,
    "refresh_expires_in": 1800,
    "refresh_token": "refresh_token",
    "token_type": "bearer"
}

5. 重新整理token介面

透過第4步獲取到合法的token後,token的有效期是30分鐘,可以在kc上配置,如果過期了,需要透過重新整理token介面獲取新的token

  • /auth/realms/{realm}/protocol/openid-connect/token
  • 請求方式:POST
  • 請求引數:
client_id: 客戶端id
client_secret: 客戶端密碼
grant_type: refresh_token
refresh_token: 透過第4步獲取到的refresh_token
  • 返回引數:
{
    "access_token": "token",
    "expires_in": 1800,
    "refresh_expires_in": 1800,
    "refresh_token": "refresh_token",
    "token_type": "bearer"
}

6. kc的使用者資訊介面

透過第4步獲取到的token,可以透過使用者資訊介面獲取到使用者的資訊

  • /auth/realms/{realm}/protocol/openid-connect/userinfo
  • 請求方式:GET
  • 請求頭:
Authorization Bearer token
  • 返回引數:
{
    "sub": "1",
    "email_verified": false,
    "name": "admin",
    "preferred_username": "admin",
    "given_name": "admin",
    "family_name": "admin",
    "email": "
}

kc的jwt-token欄位說明

  • exp token過期時間戳
  • iat token生成時間戳
  • jti token的唯一身份標識,對接token_id或者refresh_token_id,這兩個id在服務端會有儲存,與它頒發的token裡的jti相對應
  • iss token的發行機制,kc中的域,例如:https://kc.xxx.com/auth/realms/
  • aud 授權到的客戶端
  • sub 當前使用者ID
  • typ 認證方式
  • azp 當前客戶端client_id
  • session_state 當前會話id,瀏覽器中的AUTH_SESSION_ID和AUTH_SESSION_ID_LEGACY
  • acr 如果clientSession透過cookie (SSO)進行身份驗證,則使用0,否則為1
  • allowed-origins 允許哪種域名使用我們的token
  • realm_access 域的許可權
  • resource_access 客戶端(資源)許可權,kc允許你為使用者依照客戶端去授權
  • scope 客戶端模板,它將一類jwt中的屬性進行分類,透過這個scope模組去渲染你的jwt欄位

相關文章