SHiNE-server/Dev_Docs/01_Connection_and_Sessions.md

3.4 KiB
Raw Blame History

Соединение с сервером и сессии

1) Базовый транспорт

  • Сервер работает по WebSocket + JSON-протокол (op, requestId, payload).
  • Для каждой операции есть handler в JsonHandlerRegistry.

2) Схема авторизации (актуальная)

В проекте реализованы две двухшаговые схемы:

A. Создание новой сессии (через device key)

  1. AuthChallenge(login)

    • сервер проверяет, что пользователь существует;
    • кладёт в контекст соединения authNonce.
  2. CreateAuthSession(...)

    • клиент подписывает строку AUTH_CREATE_SESSION:{login}:{timeMs}:{authNonce} приватным device key;
    • сервер валидирует подпись, создаёт запись в active_sessions, возвращает sessionId;
    • в сессии хранится session_key (публичный ключ сессии), который клиент сгенерировал для дальнейших логинов.

B. Вход в существующую сессию (через session key)

  1. SessionChallenge(sessionId)

    • сервер выдаёт одноразовый nonce с TTL.
  2. SessionLogin(sessionId, timeMs, signature)

    • клиент подписывает SESSION_LOGIN:{sessionId}:{timeMs}:{nonce} приватным ключом сессии;
    • сервер проверяет подпись по active_sessions.session_key;
    • при успехе возвращает storagePwd.

3) Работа со списком сессий

ListSessions

  • Доступно только в состоянии AUTH_STATUS_USER.
  • Возвращает все активные сессии текущего пользователя:
    • sessionId
    • информация о клиенте
    • lastAuthirificatedAtMs
    • гео (по ip, через кэш/lookup).

CloseActiveSession

  • В реестре операций присутствует.
  • Используется для закрытия указанной или текущей сессии.

4) Важные детали безопасности

  • Есть проверка рассинхрона времени клиента (обычно ±30 секунд).
  • Nonce одноразовые, хранятся в контексте конкретного ws-соединения.
  • При ошибках подписи/контекста сервер может закрывать WebSocket.

5) Что уже хорошо

  • Разделены key-и: device key (создание сессии) и session key (повторные входы).
  • Не передаётся приватный ключ — только подписи.
  • Авторизация привязана к challenge/nonce.

6) Что стоит дополнительно улучшить

  1. Добавить централизованный лимит попыток на SessionLogin/CreateAuthSession.
  2. Логировать причины отказов в метриках (без утечки чувствительных данных).
  3. Явно документировать формат Base64 (URL-safe/standard) для каждого поля, чтобы клиенты не путались.