Данный материал является продолжением серии постов про внедрение 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 и пишем туда что хотим.
Продолжение следует…