Все пользовательские сервисы Gnexus подключаются к центральному SSO — gnexus-auth (Laravel). Сервис не создаёт собственную систему пользователей и не имеет собственной «страницы входа» — в сервисе только гейт (заглушка с кнопкой Войти по OAuth PKCE).
/admin/clients.<сервис>/auth/callback)..env сервиса и в gnexus-creds, не в git.gnexus-auth-client-py (Python), gnexus-auth-client-php (PHP).sub из gnexus-auth; локальная запись пользователя зеркалируется (user_id, email, имя, профиль), профиль gnexus-auth — источник истины./auth/login → callback), scopes openid email profile roles permissions.user.* с HMAC-подписью (см. ниже).profile.locale) — источник языка интерфейса по умолчанию (см. i18n.md)./auth/login только по явному клику — никаких авто-редиректов на загрузку страницы.GET /me → denied (гейт с кнопкой входа) или ready (интерфейс).ghard_session) из SQLite, TTL ~7 суток; state/PKCE тоже в SQLite (oauth_states).401 из API → ивент unauthenticated → сессии нет → гейт (не редирект).GET /me возвращает {auth_enabled, user: {user_id, email, display_name, avatar_url}, locale…}.PATCH /me) — только по cookie-сессии: у Bearer-токенов нет личности (Bearer-админ → 401).Допустимый вариант каркаса для SPA без серверной cookie-сессии (референс gnexus-synapse): access/refresh-токены хранит сам SPA (localStorage), каждый API-запрос — Authorization: Bearer <access>, и личность на сервере устанавливается call-home в /oauth/userinfo на каждый запрос (токены opaque; локальной проверки нет). Отличия от cookie-паттерна:
PATCH /me) работает по Bearer: личность у Bearer-токена есть, пока проходит userinfo.user_prefs (ПК sub, locale + служебные флаги) — не полноценная зеркальная запись, а микрорекомендация.401 из API тот же сигнал гейта: SPA делает один тихий refresh, после повторного 401 — гейт, poll /me держит сессию живой.store_login по user_id) и отзываюся вебхуком auth.logout/ global_logout/session.revoked, т.к. SSO-сервер не отзывает access-токены по прямому logout.Роут /webhooks/gnexus-auth, подпись HMAC в заголовках (t=<ts>,v1=<hmac>), секрет — *AUTH_WEBHOOK_SECRET:
profile хранится verbatim JSON). Не должен затирать локальные override-ы пользователя (например override языка).| Кто | Как | Для чего |
|---|---|---|
| Браузер | cookie-сессия через SSO | UI, PATCH /me |
| Скрипты, MCP, ИИ-агенты | Bearer API-токен сервиса (см. mcp.md) | REST API |
| Машинные агенты | ключи агрегатов (ghm_…, X-Server-Key) |
отдельные каналы (ingest) |
gnexus-auth-client-py, gnexus-auth-client-php10-systems/services/gnexus-auth.md