Перейти к основному содержимому
Версия: 1.23.3

Авторизация через Keycloak

Когда неавторизованный пользователь открывает любую страницу SimpleOne (по прямой ссылке или ссылке на определенную запись), система проверяет наличие токена доступа SimpleOne (access_token).

внимание

Работает для всех страниц, кроме /side-door и /portal/login.

Локальный токен есть

Система выполняет GET запрос v1/user/me с авторизацией Bearer Token={access_token}. Если токен действительный, в ответе на запрос приходят данные пользователя, и система SimpleOne авторизует его.

Локального токена нет

  1. Данные пользователя не получены в ответе на GET запрос v1/user/me.

  2. Система выполняет 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.

    Таблица ниже содержит комбинации значений системных свойств, необходимые для переадресации на указанные страницы.

    simple.sso.activesimple.welcome_page.urlsimple.sso.priority_over_welcome_page
    falsefalse или значение не заданоfalse
    falsefalse или значение не заданоtrue
  3. В случае перехода на страницу /<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


  1. При обратной переадресации пользователя со стороны Keycloak проверяется наличие параметров state, session_state, id_token, access_token и expires_in в URL.
примечание

Если хотя бы один параметр отсутствует, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).

  1. Сравниваются значения параметра state, полученные из Keycloak и с сервера SimpleOne. Если значения совпадают, значение параметра state, переданное с сервера, очищается, и обрабатываются параметры из Keycloak.
примечание

Если значения параметров не совпадают, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).

Дешифрование JSON веб-токенов


  1. На стороне сервера проверяется наличие заголовка (Header), данных (Payload) и подписи (Signature) JSON веб-токена (JWT).
примечание

Если у JWT нет подписи (Signature), то токен считается недействительным, пользователь переадресовывается на страницу /logout. Ошибка записывается в Журнал исключений (sys_exception_log).

  1. Система по полученному из заголовка (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. Третья вкладка иллюстрирует ответ системы в случае одновременной авторизации пользователей со схожими логинами в разных регистрах.

simple.login.username.sensitivity.enabledResult
falseЗначения в системе и из Keycloak совпадают. Пользователь авторизуется.
trueЗначения в системе и из Keycloak не совпадают. Пользователь не авторизуется.

Регистрация


Регистрация происходит автоматически, если пользователя нет в системе, но у него есть учетная запись в Keycloak, и на форме Соединения OIDC установлен флажок Включить создание пользователей. Скрипт на стороне сервера обрабатывает поля preferred_username и email из валидного JWT.

Новый пользователь создается посредством соотношения следующих полей в SimpleOne и Keycloak:

Поле KeycloakПоле SimpleOneТип данныхОписание
preferred_usernameusernamestringЛогин
given_namefirst_namestringИмя
family_namelast_namestringФамилия
emailemailstringЭлектронная почта

При неудачной авторизации пользователь получит уведомление об ошибке авторизации и будет перенаправлен на страницу /logout.

подсказка

Если у пользователя нет учетной записи в Keyсloak, но есть на экземпляре SimpleOne, для авторизации можно использовать следующий URL <instance.simpleone.ru>/side-door.