Перейти к основному содержимому
Версия: 1.21.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 и проверяет значения следующих системных свойств. В зависимости от значений этих свойств, пользователь перенаправляется на соответствующий URL:

    • simple.sso.active
    • simple.welcome_page.url
    • simple.sso.priority_over_welcome_page
    simple.sso.activesimple.welcome_page.urlsimple.sso.priority_over_welcome_page
    falsefalsefalse
    falsefalsetrue
  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 возвращает значения электронной почты или логина в нижнем регистре. Например, для кейсов ниже – user1.

Возможные кейсы:

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

Регистрация


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

В SimpleOne создается пользователь посредством соотношения данных:

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

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

подсказка

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