Авторизация через 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 и проверяет значения следующих системных свойств. В зависимости от значений этих свойств, пользователь перенаправляется на соответствующий URL:
- simple.sso.active
- simple.welcome_page.url
- simple.sso.priority_over_welcome_page
- /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/null true true true (задано значение) true simple.sso.active simple.welcome_page.url simple.sso.priority_over_welcome_page false true (задано значение) false false true true 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 возвращает значения электронной почты или логина в нижнем регистре. Например, для кейсов ниже – user1.
Возможные кейсы:
- User1
- user1
- Два пользователя с похожими логинами: User1 и user1
Не учитывать регистр | simple.login.username.sensitivity.enabled | Result |
---|---|---|
Да | true/false | Значения в системе и из Keycloak совпадают. Пользователь авторизуется. |
Нет | true/false | Значения в системе и из Keycloak не совпадают. Пользователь не авторизуется. |
Не учитывать регистр | simple.login.username.sensitivity.enabled | Result |
---|---|---|
Да | true/false | Значения в системе и из Keycloak совпадают. Пользователь авторизуется. |
Нет | true/false | Значения в системе и из Keycloak совпадают. Пользователь авторизуется. |
Не учитывать регистр | simple.login.username.sensitivity.enabled | Result |
---|---|---|
Да | true | Значения обоих логинов пользователей совпадают со значением из Keyсloak. В результате ни один из пользователей не будет авторизован, система выводит ошибку. |
Нет | true | При сверке значений, логин пользователя User1 не совпадает со значением из Keycloak. Система проверяет значение следующего пользователя user1, который авторизуется, так как значения совпадают. |
Регистрация
Регистрация в системе происходит автоматически, если пользователя нет в системе, но у него есть учетная запись в Keycloak, а на форме Соединения OIDC установлен флажок Включить создание пользователей. Скрипт на стороне сервера обрабатывает поля preferred_username и email из валидного JWT.
В SimpleOne создается пользователь посредством соотношения данных:
Поле 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.