3.4 KiB
3.4 KiB
Соединение с сервером и сессии
1) Базовый транспорт
- Сервер работает по WebSocket + JSON-протокол (
op,requestId,payload). - Для каждой операции есть handler в
JsonHandlerRegistry.
2) Схема авторизации (актуальная)
В проекте реализованы две двухшаговые схемы:
A. Создание новой сессии (через device key)
-
AuthChallenge(login)- сервер проверяет, что пользователь существует;
- кладёт в контекст соединения
authNonce.
-
CreateAuthSession(...)- клиент подписывает строку
AUTH_CREATE_SESSION:{login}:{timeMs}:{authNonce}приватным device key; - сервер валидирует подпись, создаёт запись в
active_sessions, возвращаетsessionId; - в сессии хранится
session_key(публичный ключ сессии), который клиент сгенерировал для дальнейших логинов.
- клиент подписывает строку
B. Вход в существующую сессию (через session key)
-
SessionChallenge(sessionId)- сервер выдаёт одноразовый nonce с TTL.
-
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) Что стоит дополнительно улучшить
- Добавить централизованный лимит попыток на
SessionLogin/CreateAuthSession. - Логировать причины отказов в метриках (без утечки чувствительных данных).
- Явно документировать формат Base64 (URL-safe/standard) для каждого поля, чтобы клиенты не путались.