Авторизация через Keycloak
Когда неавторизованный пользователь открывает любую страницу SimpleOne (по прямой ссылке или ссылке на определенную запись), система проверяет наличие токена доступа SimpleOne (access_token).
Работает для всех страниц, кроме /side-door и /portal/login.
Локальный токен есть
Система выполняет GET запрос v1/user/me с авторизацией Bearer Token={access_token}. Если токен действительный, в ответе на запрос приходят данные пользователя, и система SimpleOne авторизует его.
Локального токена нет
-
Данные пользователя не получены в ответе на GET запрос v1/user/me.
-
Система выполняет GET запрос v1/sso/login и проверяет значения системных свойств, описанных ниже.
- simple.sso.active – свойство определяет, включена ли авторизация по единой точке входа (SSO).
- simple.welcome_page.url – свойство содержит URL начальной страницы. Если значение свойства false, перенаправление на начальную страницу отключено.
- simple.sso.priority_over_welcome_page – значение свойства true устанавливает приоритет страницы входа по единой точке над начальной страницей.
Комбинация значений этих свойств определяет, на какую страницу будет перенаправлен пользователь:
- /login – страница логина по умолчанию, без использования SSO.
- /ssoLoginUrl – страница логина с использованием SSO.
- /welcomePageUrl – страница, указанная в системном свойстве simple.welcome_page.url.
Таблица ниже содержит комбинации значений системных свойств, необходимые для переадресации на указанные страницы.
- /login
- /ssoLoginUrl
- /welcomePageUrl
simple.sso.active simple.welcome_page.url simple.sso.priority_over_welcome_page false false или значение не задано false false false или значение не задано true simple.sso.active simple.welcome_page.url simple.sso.priority_over_welcome_page true false или значение не задано false true false или значение не задано true true значение задано true simple.sso.active simple.welcome_page.url simple.sso.priority_over_welcome_page false значение задано false false значение задано true true значение задано false -
В случае перехода на страницу /<welcomePageUrl> с виджетом авторизации Keycloak система проверяет наличие токена доступа SimpleOne (access_token).
-
Локальный токен есть → пользователь перенаправляется на главную страницу.
-
Локального токена нет → запрашиваются параметры для формирования ссылки на Keycloak. При наличии активной записи Соединения OIDC, с сервера передаются параметры из активной записи и формируется ссылка, на которую система перенаправляет пользователя и выполняет GET запрос auth?.
Если ссылка в свойстве simple.welcome_page.url не совпадает со значением ссылки переадресации соединения OIDC, пользователи могут перейти по прямой ссылке на страницу авторизации или страницу с виджетом и войти в систему.
примечаниеЕсли активной записи Соединения OIDC нет, и в системном свойстве simple.welcome_page.url указан URL виджета авторизации Keycloak, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).
-
Проверка параметра state
- При обратной переадресации пользователя со стороны Keycloak проверяется наличие параметров state, session_state, id_token, access_token и expires_in в URL.
Если хотя бы один параметр отсутствует, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).
- Сравниваются значения параметра state, полученные из Keycloak и с сервера SimpleOne. Если значения совпадают, значение параметра state, переданное с сервера, очищается, и обрабатываются параметры из Keycloak.
Если значения параметров не совпадают, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).
Дешифрование JSON веб-токенов
- На стороне сервера проверяется наличие заголовка (Header), данных (Payload) и подписи (Signature) JSON веб-токена (JWT).
Если у JWT нет подписи (Signature), то токен считается недействительным, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).
- Система по полученному из заголовка (Header) уникальному ID ключа (kid) находит сертификат IdP для дешифрования подписи (Signature). Если соответствующий сертификат не найден, система обрабатывает значения полей URL IdP и Пространство связанной активной записи Соединения OIDC и выполняет GET запрос /certs.
Если при повторном поиске сертификат по kid не найден, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).
Проверка JWT и верификация Signature
Если сертификат по уникальному ID ключа (kid) найден, для валидации JWT и подписи (Signature) система устанавливает в массив переменных значения параметров для валидации и верификации этих параметров и полученных токенов (id_token и access_token). С помощью обоих валидных токенов и публичного сертификата система верифицирует подпись (Signature).
Если хотя бы один из токенов не действительный, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).
Авторизация
После успешной валидации JWT система проверяет на стороне сервера значение поля Логин в таблице Сотрудники (employee) по соответствующему значению из Keycloak.
Обратите внимание, что Keycloak возвращает значения электронной почты или логина в нижнем регистре. Вы можете определить, должна ли система учитывать регистр логина, задав значение системного свойства simple.login.username.sensitivity.enabled. Если установлено значение true, система проверяет регистр символов в логине пользователя при попытке авторизации, и пользователи, у которых в логине есть символы в верхнем регистре, не смогут авторизоваться из-за того, что Keycloak возвращает только символы в нижнем регистре.
Пример: В Keycloak есть пользователь с логином user1. Таблица ниже иллюстрирует ответы системы в различных сценариях в зависимости от значения системного свойства simple.login.username.sensitivity.enabled. Две первые вкладки соответствуют логину пользователя, который совершает попытку авторизации, в системе SimpleOne. Третья вкладка иллюстрирует ответ системы в случае одновременной авторизации пользователей со схожими логинами в разных регистрах.
- User1
- user1
- Два пользователя с похожими логинами: User1 и user1
simple.login.username.sensitivity.enabled | Result |
---|---|
false | Значения в системе и из Keycloak совпадают. Пользователь авторизуется. |
true | Значения в системе и из Keycloak не совпадают. Пользователь не авторизуется. |
simple.login.username.sensitivity.enabled | Result |
---|---|
false | Значения в системе и из Keycloak совпадают. Пользователь авторизуется. |
true | Значения в системе и из Keycloak совпадают. Пользователь авторизуется. |
simple.login.username.sensitivity.enabled | Result |
---|---|
false | Значения обоих логинов пользователей совпадают со значением из Keyсloak. В результате ни один из пользователей не будет авторизован, система выводит ошибку. |
true | При сверке значений, логин пользователя User1 не совпадает со значением из Keycloak. Система проверяет значение следующего пользователя user1, который авторизуется, так как значения совпадают. |
Регистрация
Регистрация происходит автоматически, если пользователя нет в системе, но у него есть учетная запись в Keycloak, и на форме Соединения OIDC установлен флажок Включить создание пользователей. Скрипт на стороне сервера обрабатывает поля preferred_username и email из валидного JWT.
Новый пользователь создается посредством соотношения следующих полей в SimpleOne и Keycloak:
Поле Keycloak | Поле SimpleOne | Тип данных | Описание |
---|---|---|---|
preferred_username | username | string | Логин |
given_name | first_name | string | Имя |
family_name | last_name | string | Фамилия |
string | Электронная почта |
При неудачной авторизации пользователь получит уведомление об ошибке авторизации и будет перенаправлен на страницу /logout.
Если у пользователя нет учетной записи в Keyсloak, но есть на экземпляре SimpleOne, для авторизации можно использовать следующий URL <instance.simpleone.ru>/side-door.