Вызов 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:

  1. включите "Учетные записи служб", как вы говорите
  2. установите "Типы доступа" на конфиденциальный - это позволяет использовать client_secret и назначает секрет (вкладка Credentials).
  3. на вкладке "Учетные записи служб" предоставьте учетной записи службы роль администратора области из роли клиента управления областью

Так как я делал это для клиента 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

Другие вопросы по тегам