Вызов API REST KeyCloak Admin с использованием клиентских секретов
Пример использования CURL по адресу https://keycloak.gitbooks.io/server-developer-guide/content/v/2.2/topics/admin-rest-api.html работает для меня при запуске KeyCloak из образа Docker.
Чтобы приблизиться к конечной форме моего приложения, я хочу аутентифицироваться, используя идентификатор клиента и секрет, а не имя пользователя + пароль.
Однако, когда я переключаю клиента admin-cli на "учетные записи служб включены", я получаю конфиденциальный тип доступа и получаю токен с помощью следующего вызова:
curl -d "client_id=admin-cli" -d "client_id=admin-cli" -d "client_secret=xxxx" -d "grant_type=client_credentials" "http://localhost:8080/auth/realms/master/protocol/openid-connect/token"
Этот токен приводит к ошибке 403 от обращений к REST API администратора. Я сделал что-то не так?
4 ответа
Вот как я реализовал client_credentials в admin-cli:
- включите "Учетные записи служб", как вы говорите
- установите "Типы доступа" на конфиденциальный - это позволяет использовать client_secret и назначает секрет (вкладка Credentials).
- на вкладке "Учетные записи служб" предоставьте учетной записи службы роль администратора области из роли клиента управления областью
Так как я делал это для клиента admin-cli в определенной области, вы можете изменить область с 'master' на любую область, в моем случае EEC-RLM:
http://192.168.101.139:8080/auth/realms/EEC-RLM/protocol/openid-connect/token
Для полноты, когда вы вызываете uri администратора, вы устанавливаете заголовок Authorization в "Bearer access_token", где access_token - это access_token, возвращенный из URI / token, выше. В моем случае я звоню:
http://192.168.101.139:8080/auth/admin/realms/EEC-RLM/users
Документация не обязательно особенно ясна, когда она связана с фактическими URL-адресами для вызова: я изначально думал, что эти операции всегда выполнялись, например, в главной области, что не так.
У меня была такая же проблема, и спустя долгое время я понял это (кстати, я использую keycloak v7.0.0).
Вот что вам нужно сделать:
- Добавить нового конфиденциального клиента к мастеру области
- Для этого клиента включите опцию
Service Accounts Enabled
- На вкладке Картографы создайте новый пользовательский картограф "Аудитория":
- Имя:
aud-mapper
- Тип картографа:
Audience
- Включенная клиентская аудитория:
security-admin-console
- Имя:
Должно получиться так:
Наконец, перейдите на вкладку "Роли учетных записей служб" и назначьте роль "admin" (или ту, которую вы хотите) клиенту службы клиента.
После этого вы можете получить токен администратора, придуманный для вашего клиента, и использовать его с Admin REST API.:
#!/usr/bin/env python
import requests
import json
headers = {"Content-Type": "application/x-www-form-urlencoded"}
url = "https://localhost:8080/auth/realms/master/protocol/openid-connect/token"
session = requests.Session()
grant_type='client_credentials'
client_id = "super-client" # change this one
client_secret = "super-client-secret" # change this one
payload = "scope=openid&client_id={0}&grant_type={1}&client_secret={2}".format(
client_id, grant_type, client_secret)
ret = session.post(url=url, headers=headers, data=payload)
token_object = json.loads(ret.text)
print (token_object['access_token'])
При аутентификации в качестве клиента, подобного этому, учетной записи службы клиента должны быть предоставлены соответствующие роли (например, "администратор"). Это можно сделать на вкладке "Роли учетных записей служб" в администраторе KeyCloak для клиента.
Вместо предоставления разрешений для всей области клиенту вы можете ограничить права администратора только на настройку клиента, используя подробные разрешения администратора: https://www.keycloak.org/docs/latest/server_admin/#_fine_grain_permissions