Протокол OIDC. Аутентификация через web SSO
Протокол включает в себя авторизацию по OAuth2.
Настройка параметров протокола выполняется в конфигурационном файле external-settings.xml.
- Доступные параметры настройки
- Пример структуры конфигурационного файла
- Настройка взаимодействия с провайдерами
- clientId — идентификатор клиента в провайдере аутентификации.
- clientSecret — секретный ключ для установления доверительных отношений между стендом SMP и сервером авторизации. Подлежит шифрованию при включенном параметре encryption.enabled=true.
- discoverUri — URI для чтения метаданных провайдера аутентификации.
- gateway — URL-адрес для выхода.
- scope — scope параметров, запрашиваемых у провайдера аутентификации. Параметры перечисляются через пробел.
- clientAuthenticationMethod — метод аутентификации при обращении к сервису выдачи маркеров. Значение по умолчанию: client_secret_basic.
-
searchStrategy — стратегия поиска сотрудников.
Представляет собой мапу, в которой ключом является код атрибута сотрудника в SMP, а значением код параметра пользователя в провайдере аутентификации.
При сопоставлении пользователя по строковым атрибутам происходит регистрозависимый поиск (например, по email).
Доступны 4 варианта стратегии:
-
and — стратегия поиска сотрудников по совпадению всех атрибутов.
Поиск выполняется по указанным атрибутам сотрудника в SMP и значениям, полученным от провайдера аутентификации, с условием "И".
Copy<and>
<attributes>
<entry>
<idpId></idpId>
<smpId></smpId>
</entry>
</attributes>
</and> -
or — стратегия поиска сотрудников по совпадению одного из атрибутов.
Поиск выполняется по указанным атрибутам сотрудника в SMP и значениям, полученным от провайдера аутентификации, с условием "ИЛИ".
Copy<or>
<attributes>
<entry>
<idpId></idpId>
<smpId></smpId>
</entry>
</attributes>
</or> -
oneByOne — стратегия поиска сотрудников по порядку в зависимости от присутствия значений атрибутов сотрудника в SMP в ответе от провайдера аутентификации.
Если значение, полученное от провайдера аутентификации, для первого из указанных атрибутов сотрудника в SMP позволяет однозначно идентифицировать только одного пользователя, то производится его аутентификация. Если не найден ни один сотрудник или найдено больше одного, то производится попытка однозначно идентифицировать пользователя по второму атрибуту, и так далее.
Copy<oneByOne>
<attributes>
<entry>
<idpId></idpId>
<smpId></smpId>
</entry>
</attributes>
</oneByOne> -
script — стратегия поиска сотрудников с помощью скрипта.
В контексте скрипта доступна мапа, содержащая:
- коды параметров, запрошенных у провайдера;
- значения параметров, полученных от провайдера;
- коды атрибутов сотрудника в SMP, по которым выполняется поиск сотрудника.
Параметр <scriptData> содержит скрипт в формате CDATA.
Возвращаемое значение:
- UUID объекта класса "Сотрудник" (employee), для которого необходимо выполнить аутентификацию;
- ошибка, если не найден ни один сотрудник или найдено больше одного.
Copy<script>
<attributes>
<entry>
<idpId></idpId>
<smpId></smpId>
</entry>
</attributes>
<scriptData></scriptData>
</script>
-
Пример структуры конфигурационного файла
Структура конфигурационного файла external-settings.xml является общей для аутентификации по протоколу OIDC независимо от провайдера.
<?xml version="1.0" encoding="UTF-8"?>
<ext:configuration xmlns:ext="http://www.naumen.ru/externalSettings" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.naumen.ru/externalSettings ../../../../../../../../sdng-generated/src/main/resources/xsd/externalSettings.xsd">
<settings>
<protocol>
<oidc>
<clientId>smp</clientId>
<clientSecret>abcdefghijk</clientSecret>
<discoverUri>https://sso.example.org/auth/realms/myrealm/.well-known/openid-configuration</discoverUri>
<gateway>https://sso.example.org/auth/realms/myrealm/protocol/openid-connect/logout</gateway>
<scope>openid email profile</scope>
<clientAuthenticationMethod>client_secret_basic</clientAuthenticationMethod>
</oidc>
</protocol>
<searchStrategy>
<and>
<attributes>
<entry>
<idpId>email</idpId>
<smpId>email</smpId>
</entry>
<entry>
<idpId>name</idpId>
<smpId>firstName</smpId>
</entry>
<entry>
<idpId>family_name</idpId>
<smpId>lastName</smpId>
</entry>
</attributes>
</and>
</searchStrategy>
<other>
<entry>
<key>other</key>
<value>settings</value>
</entry>
</other>
</settings>
</ext:configuration>