Перейти к основному содержанию

Привязка сессии к SSO

Около 3 мин

Привязка сессии к SSO (продление по refresh_token)

По умолчанию StormBPMN после успешного входа выпускает собственный токен доступа и живёт им до истечения срока — независимо от того, что происходит с сессией пользователя у провайдера аутентификации. Для многих установок это приемлемо, но службы безопасности банков и госкомпаний такое поведение запрещают: приложение не должно иметь «своей» долгой сессии, а обязано продлевать доступ у провайдера по стандартной процедуре (RFC 6749 §6).

Настройка OAuthUseRefreshTokens переводит StormBPMN в этот режим.

ЧтоБез настройкиС настройкой
Срок токена StormBPMNSESSION_EXPIRATION (по умолчанию 7 суток)Ровно столько же, сколько access token провайдера
ПродлениеНе требуетсяПо grant_type=refresh_token у провайдера
Отзыв сессии в провайдереНа StormBPMN не влияет до истечения токенаПользователь разлогинивается при ближайшем продлении

Только режим PKCE

Привязка работает только при OAuthFlowMode = PKCE. В legacy-режиме implicit_flow приложение не получает refresh_token от провайдера, поэтому продлевать нечего — настройка там не действует.

Включение

ПараметрЗначениеПримечание
OAuthUseRefreshTokenstrueПо умолчанию выключено

Настройка находится в разделе Безопасность экрана настроек инстанса, рядом с остальными параметрами OAuth2.

Что должен отдавать провайдер

Ответ token endpoint обязан содержать:

  • refresh_token — непустой;
  • expires_in — больше нуля.

Дополнительно используется refresh_expires_in, если провайдер его отдаёт: по нему StormBPMN понимает, до какого момента сессию вообще можно продлевать. Провайдеры, которые это поле не возвращают, поддерживаются — см. Хранение и очистка.

Вход будет отклонён, если провайдер не выдаёт refresh_token

При включённой настройке StormBPMN не выпускает свой долгий токен ни при каких условиях — иначе обещание «своих сессий у приложения нет» нарушалось бы молча, и узнать об этом можно было бы только из логов.

Поэтому если провайдер не вернул refresh_token или expires_in, вход через SSO отклоняется с сообщением «Провайдер аутентификации не выдал refresh_token — вход запрещён политикой безопасности». В журнале приложения появляется запись уровня ERROR с указанием, что проверить.

Прежде чем включать настройку, убедитесь, что клиент в провайдере действительно выдаёт refresh_token. В Keycloak за это отвечает Use Refresh Tokens в настройках клиента.

Проверка на одном пользователе

Настройка действует на весь инстанс сразу. Если есть сомнения в конфигурации провайдера, включайте её в нерабочее время: при неверных настройках клиента вход через SSO перестанет работать у всех, а выключить настройку обратно сможет только администратор, который войдёт по паролю.

Как это работает

  1. Пользователь входит через провайдера. StormBPMN получает от token endpoint access_token, refresh_token и сроки.
  2. refresh_token сохраняется только на сервере, в зашифрованном виде. В браузер он не передаётся никогда; в токене StormBPMN едет лишь идентификатор строки сессии.
  3. Токен StormBPMN выпускается на срок expires_in провайдера — как правило, минуты, а не дни.
  4. Интерфейс продлевает токен заранее, не дожидаясь истечения: по таймеру, при возвращении на вкладку и при получении ответа «токен истёк» на любом запросе. Для пользователя продление незаметно.
  5. Продление идёт через провайдера. Пока тот согласен продлевать сессию — работа не прерывается.

Когда сессия прекращается

СобытиеЧто происходит
Провайдер отказал в продлении (invalid_grant)Пользователь разлогинивается, серверная запись сессии удаляется
Пользователь вышел из аккаунтаСерверная запись сессии удаляется сразу, а не доживает до истечения
Учётная запись отключена администраторомБлижайшее продление отклоняется, запись удаляется
Пользователь принудительно разлогинен администраторомЗаписи сессий удаляются сразу
Учётная запись удаленаЗаписи сессий удаляются вместе с ней
Настройка выключенаПродление закрывается для всех выданных токенов, пользователи входят заново

Недоступность провайдера не разлогинивает

Если провайдер временно недоступен (перезапуск, сетевой сбой), StormBPMN отвечает «повторите позже» и сохраняет сессию. Интерфейс повторяет попытку с нарастающей паузой. Разлогинивает только явный отказ провайдера — иначе перезапуск Keycloak выкидывал бы из системы всех пользователей разом.

Хранение и очистка

refresh_token и id_token хранятся в таблице sm_oauth_refresh_sessions в зашифрованном виде — ключ шифрования выводится из JWTSECRET установки.

Записи удаляются:

  • при завершении сессии по любому сценарию из таблицы выше;
  • по истечении refresh_expires_in, если провайдер его отдавал;
  • через 30 суток без единого продления — страховка для провайдеров, которые refresh_expires_in не возвращают.

Фоновая очистка выполняется каждые 6 часов.

Таблица не входит в перенос установки

sm_oauth_refresh_sessions исключена из бандла переноса инсталляции: живые refresh-токены провайдера не должны покидать контур, в котором были выпущены. После переноса пользователи входят заново — это ожидаемое поведение, а не потеря данных.

Тайм-ауты обращения к провайдеру

Продление ходит к провайдеру по HTTP. Тайм-ауты задаются свойствами приложения:

СвойствоЗначение по умолчаниюНазначение
oauth.http.connect-timeout-ms5000Установка соединения с провайдером
oauth.http.read-timeout-ms10000Ожидание ответа token endpoint

Менять их нужно только если провайдер отвечает через медленный корпоративный прокси. Учтите: увеличенный тайм-аут удлиняет и время, которое пользователь ждёт при недоступности провайдера.

SESSION_EXPIRATION задаётся в секундах

Значение в миллисекундах не даст приложению стартовать

Переменная SESSION_EXPIRATION задаёт срок жизни токена StormBPMN и измеряется в секундах.

Приложение не стартует, если значение превышает 90 суток (7776000), и пишет в журнал, что именно проверить. Порог выбран так, чтобы отсечь значения, записанные в миллисекундах: например 86400000 — это не сутки, а 2,7 года.

Если ваша установка задаёт SESSION_EXPIRATION явно, проверьте единицу измерения: сутки это 86400, неделя — 604800.

Настройка OAuthUseRefreshTokens на это не влияет: при включённой привязке срок токена определяет провайдер, а SESSION_EXPIRATION продолжает действовать для входа по паролю и для установок без привязки.

Диагностика

СимптомВероятная причина
Вход через SSO отклонён с упоминанием refresh_tokenКлиент в провайдере не выдаёт refresh_token (в Keycloak — Use Refresh Tokens) либо ответ не содержит expires_in
Настройка включена, но сессии по-прежнему долгиеУстановлен режим implicit_flow — привязка работает только с PKCE
Пользователей разлогинивает вскоре после входаПровайдер отзывает сессию при продлении. Проверьте у клиента ограничения на повторное использование refresh-токенов и срок SSO-сессии в realm
Приложение не стартует после обновленияSESSION_EXPIRATION задан в миллисекундах — см. раздел выше