Помимо обычного входа по логину и паролю (POST /api/launcher/auth), Segmenta поддерживает вход в лаунчер через сайт: пользователь нажимает в лаунчере «Войти через сайт», подтверждает вход в браузере под своей учётной записью — и лаунчер получает токен сессии. Логин и пароль в самом лаунчере не вводятся. Поток построен по принципу device-flow: лаунчер открывает страницу подтверждения на сайте и опрашивает сервер, пока пользователь не подтвердит вход.
Фича выключена по умолчанию. Включается настройкой launcher.site_auth.enabled и использует общий секрет launcher.api_secret.

Настройка

Все настройки доступны в админ-панели → Настройки (категория «Интеграции»/«Безопасность»). Подробный справочник — в разделе Настройки сайта.
КлючПо умолчаниюОписание
launcher.api_secretОбщий секрет API лаунчера. Лаунчер передаёт его в каждом запросе.
launcher.site_auth.enabledfalseВключает вход через сайт.
launcher.site_auth.auto_approvefalseПодтверждать вход автоматически для уже залогиненного пользователя (без кнопки «Авторизовать»).
launcher.site_auth.token_ttl_hours24Срок жизни выданного токена сессии лаунчера.
launcher.site_auth.request_ttl_minutes10Сколько живёт незавершённый запрос на вход.
launcher.site_auth.poll_interval_seconds3Рекомендуемый интервал опроса (возвращается лаунчеру в ответе start).
launcher.site_auth.delivery_modepollСпособ доставки токена: poll или redirect.
launcher.site_auth.allowed_redirect_schemes[]Белый список URI-схем для доставки через deep-link (например, myluncher).
launcher.site_auth.bind_ipfalseПривязывать запрос к IP, с которого он создан.
launcher.site_auth.bind_hwidfalseПривязывать запрос к HWID лаунчера.
launcher.site_auth.branding_textЛаунчер запрашивает доступ к вашему аккаунтуТекст на экране подтверждения.
launcher.site_auth.code_secretСекрет для подписи одноразовых кодов. Генерируется автоматически при первом запуске.
Адрес сайта для ссылки подтверждения берётся из настройки connections.client_app_url (если она пуста — из CLIENT_URL).

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

1

Лаунчер создаёт запрос

Лаунчер отправляет POST /api/launcher/site-auth/start с apiSecret. В ответ приходят requestId (публичный идентификатор для ссылки), code (секретный одноразовый код только для лаунчера), authorizeUrl и рекомендованный интервал опроса.
2

Открывается страница подтверждения

Лаунчер открывает authorizeUrl ({сайт}/launcher/authorize?request={requestId}) в системном браузере, чтобы использовать уже активную сессию сайта.
3

Пользователь подтверждает вход

Если пользователь не авторизован — его перенаправит на вход и обратно. На экране подтверждения он видит название устройства и IP, и нажимает «Авторизовать» (либо вход подтверждается автоматически при включённом auto_approve). Сервер привязывает запрос к пользователю и выпускает токен сессии лаунчера.
4

Лаунчер забирает токен

Всё это время лаунчер опрашивает POST /api/launcher/site-auth/status. Пока ожидает — статус pending; после подтверждения приходит accessToken и данные пользователя. Токен одноразовый: повторный опрос вернёт статус claimed без токена.
5

Лаунчер использует токен

Полученный accessToken используется с уже существующими POST /api/launcher/session/join и POST /api/launcher/session/check — так же, как при обычном входе.

Эндпоинты

start

Создаёт запрос на вход.
  • Метод: POST /api/launcher/site-auth/start
apiSecret
string
required
Секрет launcher.api_secret.
deviceName
string
Название устройства/лаунчера — показывается на экране подтверждения.
hwid
string
HWID лаунчера (если используется bind_hwid).
deliveryMode
string
poll (по умолчанию) или redirect. Переопределяет глобальный режим для этого запроса.
redirectScheme
string
URI-схема для доставки через deep-link (только при redirect; должна быть в allowed_redirect_schemes).
Ответ:
requestId
string
Публичный идентификатор запроса (попадает в ссылку подтверждения).
authorizeUrl
string
Ссылка для открытия в браузере.
code
string
Секретный одноразовый код. Хранится только в лаунчере и нужен для опроса статуса.
expiresIn
number
Срок жизни запроса в секундах.
interval
number
Рекомендуемый интервал опроса в секундах.
deliveryMode
string
Фактический способ доставки (poll или redirect).
Ошибки: INVALID_API_SECRET, SITE_AUTH_DISABLED, TOO_MANY_REQUESTS.

status

Опрос статуса запроса. При подтверждении возвращает токен (одноразово).
  • Метод: POST /api/launcher/site-auth/status
apiSecret
string
required
Секрет launcher.api_secret.
requestId
string
required
requestId из ответа start.
code
string
required
Секретный code из ответа start.
hwid
string
HWID лаунчера (требуется при bind_hwid).
Ответ (ожидание):
status
string
pending | denied | expired | claimed.
Ответ (подтверждено):
status
string
approved.
accessToken
string
Токен сессии лаунчера для session/join и session/check.
expiresAt
string
Дата истечения токена.
user
object
Данные пользователя: uuid, username, permissions, groups, skin, cape, isBanned, roleName, roleColor.
Ошибки: INVALID_API_SECRET, INVALID_REQUEST, INVALID_CODE, TOO_MANY_REQUESTS, IP_MISMATCH, HWID_MISMATCH, SESSION_NOT_FOUND, USER_NOT_FOUND.
Эндпоинт POST /api/launcher/site-auth/claim работает идентично status — алиас для лаунчеров, которым удобнее семантика «забрать один раз».

deliver

Доставка через deep-link для режима redirect. Сайт перенаправляет браузер сюда после подтверждения.
  • Метод: GET /api/launcher/site-auth/deliver?request={requestId}
Возвращает HTTP-редирект (302) на {redirectScheme}://auth?request={requestId}без токена, только как сигнал «вернись в лаунчер». Сам токен лаунчер всё равно забирает через status (по apiSecret + code). Так токен никогда не проходит через браузер.

Режим доставки

Лаунчер с момента start периодически опрашивает status. Когда пользователь подтвердит вход — в ответе придёт токен. Работает везде, не требует регистрации URI-схемы.

Безопасность

  • apiSecret проверяется на каждом REST-запросе (сравнение за постоянное время) и ограничивается по частоте.
  • requestId (публичный, в ссылке) и code (секретный, только в лаунчере) — разные значения: знание ссылки не даёт получить токен.
  • Токен выдаётся ровно один раз (атомарный переход approvedclaimed).
  • Опционально запрос привязывается к IP (bind_ip) и HWID (bind_hwid).
  • В режиме redirect токен не проходит через браузер — deep-link несёт только requestId.
Держите allowed_redirect_schemes строгим: только приватная URI-схема вашего лаунчера, без http/https.