Протокол SAML 2.0 является стандартом для Single Sign-On (SSO) в корпоративной среде. В этом руководстве мы покажем, как использовать OpenIG в качестве прокси и Service Provider, чтобы легко добавить SAML-аутентификацию к любому вашему приложению без изменения его кода.
Внесите в файл hosts имена хостов для OpenAM и OpenIG. В системах под управлением Windows файл hosts расположен в директории C:\Windows/System32/drivers/etc/hosts, на Linux или Mac OS - в /etc/hosts.
127.0.0.1 openam.example.org openig.example.org
Разверните контейнер OpenAM командой
docker run -h openam.example.org -p 8080:8080 --name openam openidentityplatform/openam
И выполните первоначальную настройку:
docker exec -w '/usr/openam/ssoconfiguratortools' openam bash -c \
'echo "ACCEPT_LICENSES=true
SERVER_URL=http://openam.example.org:8080
DEPLOYMENT_URI=/$OPENAM_PATH
BASE_DIR=$OPENAM_DATA_DIR
locale=en_US
PLATFORM_LOCALE=en_US
AM_ENC_KEY=
ADMIN_PWD=passw0rd
AMLDAPUSERPASSWD=p@passw0rd
COOKIE_DOMAIN=example.org
ACCEPT_LICENSES=true
DATA_STORE=embedded
DIRECTORY_SSL=SIMPLE
DIRECTORY_SERVER=openam.example.org
DIRECTORY_PORT=50389
DIRECTORY_ADMIN_PORT=4444
DIRECTORY_JMX_PORT=1689
ROOT_SUFFIX=dc=openam,dc=example,dc=org
DS_DIRMGRDN=cn=Directory Manager
DS_DIRMGRPASSWD=passw0rd" > conf.file && java -jar openam-configurator-tool*.jar --file conf.file'
amadmin и паролем passw0rd.openamtestcothttp://openig.example.org:8081/samlНажмите Create
Настройки Fedlet будут сохранены в контейнере в директории /usr/openam/config/myfedlets/openig/Fedlet.zip
Скопируйте настройки на хост командой:
docker cp openam:/usr/openam/config/myfedlets/openig/Fedlet.zip .
demodemo@example.org или другой корректный адресopenig-samlconfigВ директории config создайте файл admin.json и config.json:
admin.json:
{
"prefix" : "openig",
"mode": "PRODUCTION"
}
config.json:
{
"heap": [
{
"name": "JwtSession",
"type": "JwtSession"
},
{
"name": "capture",
"type": "CaptureDecorator",
"config": {
"captureEntity": true,
"_captureContext": true
}
}
],
"handler": {
"type": "Chain",
"config": {
"filters": [],
"handler": {
"type": "Router",
"name": "_router",
"capture": "all"
}
}
}
}
config добавьте директорию для маршрутов routesДобавьте в директорию routes маршрут по умолчанию 99-default.json. OpenIG по этому маршруту будет отдавать статический контент и не будет требовать аутентификацию:
{
"handler": {
"type": "DispatchHandler",
"config": {
"bindings": [
{
"handler": {
"type": "StaticResponseHandler",
"config": {
"status": 200,
"reason": "OK",
"entity":
"<!doctype html>
<html>
<head>
<title>Home</title>
<meta charset='UTF-8'>
</head>
<body>
<h1><a href='/app'>Login</a></h1>
</body>
</html>"
}
}
}
]
}
},
"session": "JwtSession"
}
Запустите Docker контейнер OpenIG командой. Обратите внимание на смонтированную директорию /app-saml
docker run -h openig.example.org -p 8081:8080 --name openig \
-v ./app-saml:/usr/local/app-saml:ro \
-e "CATALINA_OPTS=-Dopenig.base=/usr/local/app-saml" \
openidentityplatform/openig
Проверьте работу приложения:
$ curl -v http://openig.example.org:8081
* Trying 127.0.0.1:8081...
* Connected to openig.example.org (127.0.0.1) port 8081 (#0)
> GET / HTTP/1.1
> Host: openig.example.org:8081
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Length: 146
< Date: Mon, 24 Nov 2025 12:46:56 GMT
<
<!doctype html>
<html>
<head>
<title>Home</title>
<meta charset='UTF-8'>
</head>
<body>
<h1><a href='/app'>Login</a></h1>
</body>
Остановите контейнер OpenIG
docker stop openig | xargs docker rm
openig-saml создайте директорию SAMLСкопируйте в нее содержимое архива Fedlet.zip, который вы получили из OpenAM
unzip Fedlet.zip
cp conf/* app-saml/SAML/
Создайте маршрут получения учетных данных из assertions SAML 05-saml.json
{
"handler": {
"type": "SamlFederationHandler",
"config": {
"assertionMapping": {
"uid": "uid",
"mail": "mail"
},
"redirectURI": "/app"
}
},
"condition": "${matches(request.uri.path, '^/saml')}",
"session": "JwtSession"
}
Создайте маршрут приложения, требующего аутентификации SAML 05-app.json:
{
"handler": {
"type": "DispatchHandler",
"config": {
"bindings": [
{
"condition": "${empty session.uid}",
"handler": {
"type": "StaticResponseHandler",
"config": {
"status": 302,
"reason": "Found",
"headers": {
"Location": [
"http://openig.example.org:8081/saml/SPInitiatedSSO"
]
}
}
}
},
{
"handler": {
"handler": {
"type": "StaticResponseHandler",
"config": {
"status": 200,
"reason": "OK",
"entity":
"<!doctype html>
<html>
<head>
<title>OpenID Connect Discovery</title>
<meta charset='UTF-8'>
</head>
<body>
<h1>User: ${session.uid}, email: ${session.mail} </h1>
</body>
</html>"
}
}
}
}
]
}
},
"condition": "${matches(request.uri.path, '^/app')}",
"session": "JwtSession"
}
Запустите контейнер OpenIG:
docker run -h openig.example.org -p 8081:8080 --name openig \
-v ./app-saml:/usr/local/app-saml:ro \
-e "CATALINA_OPTS=-Dopenig.base=/usr/local/app-saml" \
openidentityplatform/openig
Откройте ссылку приложения OpenIG, не требующего аутентификации: http://openig.example.org:8081/.

Login.Введите учетные данные пользователя demo. Логин: demo, пароль: changeit и нажмите кнопку Login.

Вас перенаправит в приложение с учетными данными пользоваателя demo:

Мы успешно настроили OpenIG как Service Provider и реализовали аутентификацию SAML 2.0 через OpenAM. Теперь вы можете использовать этот подход для защиты любых приложений в вашей инфраструктуре. Следующим шагом может стать настройка Log Out.
Более подробно о настройке OpenAM и OpenIG вы можете почитать в документации: