Clients
Клиенты - сущности, которые могут отправлять запрос в Keycloak на аутентификацию пользователя. Чтобы приложение могло использовать ресурсы keycloak, оно должно быть зарегистрировано. Клиенты делятся по идентификаторам.
Настройка через консоль управления реалмом, раздел клиенты. Желательно настраивать на каждый сервер / сервис отдельный клиент.
Раздел Clients
Client list
Client list - список клиентов. Параметры настройки клиента:
Клиенты по умолчанию в Master realm:
| Название | Описание | Адрес |
| account | Клиент пользовательского личного кабинета. Управление профилем, просмотр сеансов входа и разрешения. | /realms/{realm}/account |
| account-console | Фронтенд клиента account, вызывающий API account. |
|
| admin-cli | Клиент взаимодействия с Keycloak через CLI или REST API. Например получение токена через kcadm.sh или curl для скриптов/CI/CD. Поддерживает client_credentials и password гранты. |
|
| broker |
Внутренний клиент для федерации идентичности (SSO между провайдерами). Пример: Keycloak как Identity Broker между Google, GitHub и другим Keycloak сервером. |
|
| master-realm | Формальный клиент, представляющий сам master realm. Часто используется для определённых внутренних механизмов и ссылок в Admin Console. |
|
| security-admin-console | Клиент для административной консоли Keycloak. Используется при входе в админ-панель, управлении реалмами, пользователями и клиентами. | /admin/{realm}/console |
Пример работы с admin-cli:
import requests
def get_keycloak_token():
url = "http://192.168.1.195:9090/realms/master/protocol/openid-connect/token"
payload = {
"grant_type": "password",
"client_id": "admin-cli",
"username": "admin",
"password": "admin",
}
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.post(url, data=payload, headers=headers)
# Проверка на ошибки HTTP
response.raise_for_status()
print(response.json())
get_keycloak_token()
Ответ сервера:
{
'access_token': hbG...L7A',
'expires_in': 60,
'refresh_expires_in': 1800,
'refresh_token': 'hbG...gcQ',
'token_type': 'Bearer',
'not-before-policy': 0,
'session_state': 'f...c',
'scope': 'profile email'
}
Если затем сформировать например get запрос к endpoint /admin/realms с заголовком Authorization Brearer <access_token> то будет доступ. Полный пример запроса:
import requests
BASE_URL = "http://192.168.1.195:9090"
def get_keycloak_token():
url = f"{BASE_URL}/realms/master/protocol/openid-connect/token"
payload = {
"grant_type": "password",
"client_id": "admin-cli",
"username": "admin",
"password": "admin",
}
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.post(url, data=payload, headers=headers)
response.raise_for_status()
return response.json()["access_token"]
def get_realms(access_token: str):
url = f"{BASE_URL}/admin/realms"
headers = {
"Authorization": f"Bearer {access_token}"
}
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.json()
if __name__ == "__main__":
try:
token = get_keycloak_token()
realms = get_realms(token)
print("Realms:")
for realm in realms:
print("-", realm.get("realm"))
except requests.HTTPError as e:
print("HTTP error:", e.response.text)
except Exception as e:
print("Unexpected error:", str(e))
Client registration
Параметры, которые будут применяться к пользователям, зарегистрированным в клиентах.
Раздел client scopes
