Процесс авторизации состоит из 3 этапов:
GET /sso/{type}): Клиент запрашивает вход через конкретного провайдера (например, keycloak). Метод сохраняет метаданные и контекст безопасности в сессию, после чего перенаправляет пользователя на форму авторизации провайдера.Для настройки авторизации на стороне wnam необходимо прописать в application.yaml следующие настройки (на примере keycloak)
security:
oauth2:
client:
registration:
keycloak:
client-id: Идентификатор клиента
client-secret: xhLsyufdaodtkOwdl8Mzb3AxMnoENast
scope:
- profile
- phone
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
keycloak:
authorization-uri: https://<внешняя система>/realms/<ваш realm в keycloak>/protocol/openid-connect/auth
token-uri: https://<внешняя система>/realms/<ваш realm в keycloak>/protocol/openid-connect/token
user-info-uri: https://<внешняя система>/realms/<ваш realm в keycloak>/protocol/openid-connect/userinfo
jwk-set-uri: https://<внешняя система>/realms/<ваш realm в keycloak>/protocol/openid-connect/certs
user-name-attribute: sub
profile, email, phone. Эти данные запрашиваются у пользователя при первом входе и будут доступны в объекте OAuth2User после успешной расшифровки UserInfo или ID-токена.{baseUrl} динамически подставляет текущий хост приложения (например, https://my-app.com). Финальный Callback URL в панели Keycloak должен быть строго зафиксирован как https://<ваш_домен>/login/oauth2/code/keycloak, иначе провайдер заблокирует запрос с ошибкой invalid_redirect_uri.user-name-attribute: sub указывает Spring Security использовать стандартный для OIDC идентификатор sub (Subject) в качестве уникального имени пользователя (Principal.getName()) внутри защищенного контекста приложения.В конструкторе страниц выбираем шаблон sms.html открываем экспертный режим редактирования и добавляем туда код
<!-- Submit Button keycloak -->
<div class="form-group" style="${template_keycloaksubmitbutton_disabled='display:none'}">
<button type="button" onclick="keycloakSso();" class="btn btn-primary">${template_keycloaksubmitbutton_text='<ru>Войти через кейклок</ru><en>Login with Keycloak</en><kz></kz>'}</button>
</div>
Ниже в скрипт добавляем обработчик
function keycloakSso() {
document.location.href = "/cp/sso/keycloak"
return false;
}
затем после сохранения, в меню упрощенный режим находим пункт "кнопка подтверждения" в нем ставим галочку на keycloak.
Требуемые настройки со стороны keycloak:
1. Создание или выбор Realm
2. Создание Клиента (Client)
OpenID Connectapplication.yml3. Настройка параметров безопасности (Capability config)
client-secret.authorization_code, указанный в конфиге). 4. Настройка URL-адресов клиента (Access settings)
После сохранения откроется вкладка Settings для созданного клиента. Настройте следующие поля:
https://my-app.com или http://localhost:8080).{baseUrl}/login/oauth2/code/{registrationId}, значение должно быть:https://my-app.comhttp://localhost:8080/login/oauth2/code/keycloak).+ (это автоматически разрешит CORS-запросы с адресов, указанных в Redirect URIs).5. Получение Client Secret
application.yml. Если в Keycloak секрет другой — обновите его в файле конфигурации вашего приложения.6. Настройка Scopes (Проверка передачи телефона и почты)
Поскольку в Java-конфиге запрашиваются profile, email и phone, проверьте их наличие:
profile, email и phone, а их тип (Assigned type) равен Default.phone) не настроен по умолчанию в вашем Realm, перейдите в глобальный раздел Client Scopes -> phone -> Mappers и убедитесь, что атрибут телефона пользователя из базы Keycloak привязан к Claim в токене (обычно маппер типа User Attribute с именем phone_number).
Можно проверить в тестовом режиме по адресу https://<ваш wnam>/wnam/auth_test при нажатии на ссылку Auth in Keycloak откроется окно авторизации на внешней странице.

после авторизации в кейклоак в браузере вы увидите данные пользователя.
Пример:
Name: [b38676b5-ddba-4f4b-905d-b731e1d9216d], Granted Authorities: [[ROLE_USER, SCOPE_openid roles profile email phone]], User Attributes: [{sub=b38676b5-ddba-4f4b-905d-b731e1d9216d, resource_access={account={roles=[manage-account, manage-account-links, view-profile]}}, email_verified=false, realm_access={roles=[default-roles-wnam, offline_access, uma_authorization]}, name=Вася Пупкин, phone_number=+79229040863, preferred_username=sso-test, given_name=Вася, family_name=Пупкин, email=test@mail.ru}]
При реальной авторизации пользователя данные парсятся заносятся в базу и пользователь получает доступ в интернет.