Привязка сессии к SSO
Привязка сессии к SSO (продление по refresh_token)
По умолчанию StormBPMN после успешного входа выпускает собственный токен доступа и живёт им до истечения срока — независимо от того, что происходит с сессией пользователя у провайдера аутентификации. Для многих установок это приемлемо, но службы безопасности банков и госкомпаний такое поведение запрещают: приложение не должно иметь «своей» долгой сессии, а обязано продлевать доступ у провайдера по стандартной процедуре (RFC 6749 §6).
Настройка OAuthUseRefreshTokens переводит StormBPMN в этот режим.
| Что | Без настройки | С настройкой |
|---|---|---|
| Срок токена StormBPMN | SESSION_EXPIRATION (по умолчанию 7 суток) | Ровно столько же, сколько access token провайдера |
| Продление | Не требуется | По grant_type=refresh_token у провайдера |
| Отзыв сессии в провайдере | На StormBPMN не влияет до истечения токена | Пользователь разлогинивается при ближайшем продлении |
Только режим PKCE
Привязка работает только при OAuthFlowMode = PKCE. В legacy-режиме implicit_flow приложение не получает refresh_token от провайдера, поэтому продлевать нечего — настройка там не действует.
Включение
| Параметр | Значение | Примечание |
|---|---|---|
| OAuthUseRefreshTokens | true | По умолчанию выключено |
Настройка находится в разделе Безопасность экрана настроек инстанса, рядом с остальными параметрами 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 перестанет работать у всех, а выключить настройку обратно сможет только администратор, который войдёт по паролю.
Как это работает
- Пользователь входит через провайдера. StormBPMN получает от token endpoint
access_token,refresh_tokenи сроки. refresh_tokenсохраняется только на сервере, в зашифрованном виде. В браузер он не передаётся никогда; в токене StormBPMN едет лишь идентификатор строки сессии.- Токен StormBPMN выпускается на срок
expires_inпровайдера — как правило, минуты, а не дни. - Интерфейс продлевает токен заранее, не дожидаясь истечения: по таймеру, при возвращении на вкладку и при получении ответа «токен истёк» на любом запросе. Для пользователя продление незаметно.
- Продление идёт через провайдера. Пока тот согласен продлевать сессию — работа не прерывается.
Когда сессия прекращается
| Событие | Что происходит |
|---|---|
Провайдер отказал в продлении (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-ms | 5000 | Установка соединения с провайдером |
oauth.http.read-timeout-ms | 10000 | Ожидание ответа 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 задан в миллисекундах — см. раздел выше |