Данный материал является продолжением серии постов про внедрение keycloak SSO в enterprise проект.
Темой данного поста является базовая настройка сервера Keycloak для разработки.
В прошлом посте мы создали docker-compose файл, который позволяет нам развернуть стенд Keycloak, теперь нам необходимо его настроить, для этого:
Создадим собственный realm


Теперь в рамках созданного realm создадим клиента


На следующей вкладке, включаем аутентификацию и авторизацию у нашего клиента, это нужно для того, чтобы мы могли входить в систему и совершать определенные действия не от лица пользователя (человека), а от лица клиента как такового.

Теперь у нас есть клиент, с возможностью логиниться из под него в Keycloak, давайте попробуем получить access-token с помощью сurl, для этого нам понадобится client_secret, который был сгенерирован в момент создания клиента, найти его можно в разделе credentials вашего клиента, тут важно подчеркнуть, что в продуктивном контуре этот секрет всегда должен генерироваться keycloak, однако в тестовой среде и среде для разработки допускается его определять заранее, ниже будет описано как именно.

curl --location --request POST 'http://localhost:8282/realms/demo/protocol/openid-connect/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=backend' \ --data-urlencode 'client_secret=v2iL3uK1uZxQqpYfw634SOEdAvT0UFSb' \ --data-urlencode 'grant_type=client_credentials'
{ "access_token":"eyJhbGciOiJSUzI1NiIsInR5c...", "expires_in":300, "refresh_expires_in":0, "token_type":"Bearer", "not-before-policy":0, "scope":"profile email" }
Очевидно, что производить ручную настройку клиента каждый раз неудобно и долго, к тому же в этом примере мы почти ничего не настраивали, в следующих постах мы настроим ресурсы, политики и прочее. Для того чтобы иметь возможность содержать эти настройки в коде, и автоматизировать развертывание стенда, keycloak предоставляет механизмы импорта/экспорта нашего realm.
Есть один интересный баг, который пока никто не исправил — при создании клиента создается политика по умолчанию, которая имеет тип JS (подробнее о политиках и разрешениях можно прочитать здесь https://www.keycloak.org/docs/latest/authorization_services/index.html). В более ранних версиях сложные кастомные политики можно было загружать прямо через интерфейс в виде JS кода, позже эту возможность убрали (потому что не секьюрно). Однако эта политика по умолчанию осталась, и при экспорте, она тоже выгрузится, но когда вы захотите потом импортировать ваш realm, вы получите ошибку, так как в актуальной версии JS политики можно загружать только через специальный JAR файл, однако об этом позже. Сейчас, чтобы магия случилась нам нужно удалить эту политику и связанное с ней разрешение.

Для того чтобы экспортировать realm, переходим на страницу настроек и выбираем соответствующее действие:

В итоге мы получим большой JSON файл, содержащий конфигурацию нашего realm.
Теперь мы можем усовершенствовать наш docker-compose файл из прошлого поста, мы прокинем наш файл внутрь контейнера keycloak, чтобы наш realm импортировался автоматически при старте приложения.
version: "3.9" services: keycloak-postgres: image: library/postgres:${KC_POSTGRES_IMAGE_TAG:-14} container_name: ${POSTGRES_CONTAINER_NAME:-postgres} restart: on-failure environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres healthcheck: test: pg_isready -d postgres interval: 10s timeout: 5s retries: 3 start_period: 5s ports: - ${KC_POSTGRES_PORT_MAPPING:-5435}:5432 deploy: resources: limits: memory: 256M keycloak: image: quay.io/keycloak/keycloak:20.0.2 container_name: keycloak command: - start --auto-build --db postgres --hostname-strict-https false --hostname-strict false --proxy edge --http-enabled true --import-realm --spi-user-profile-legacy-user-profile-read-only-attributes *_RES_ACCESS_MODE environment: KC_DB_URL: jdbc:postgresql://keycloak-postgres:5432/postgres KC_DB_USERNAME: postgres KC_DB_PASSWORD: postgres KC_DB_SCHEMA: public KC_FEATURES: preview KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin volumes: - type: bind source: ./src/main/resources/keycloak/import/realm-export.json target: /opt/keycloak/data/import/realm-export.json read_only: true ports: - 8282:8080 depends_on: keycloak-postgres: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://0.0.0.0:8080/realms/master"] start_period: 10s interval: 30s retries: 3 timeout: 5s
Теперь при запуске наших контейнеров, в Keycloak сразу будет realm demo и client backend.
Для удобства локальной разработки и тестирования (ЭТО ВАЖНО, В ПРОДЕ НИКОГДА ТАК НЕ ДЕЛАЙТЕ !!!), мы можем прописать secret нашего клиента в файл импорта, и тогда он не будет генерироваться заново каждый раз. Для этого в нашем JSON файле находим следующее поле: clients[YOUR CLIENT INDEX.secret и пишем туда что хотим.
Продолжение следует…
ссылка на оригинал статьи https://habr.com/ru/post/716238/
Добавить комментарий