-- ===================================================================== -- Repurpose неиспользуемого черновика Magic Link (auth_sessions) под -- реальный флоу: ротируемые refresh-токены для веб-сессий. Раньше access-JWT -- жил 10 минут без какого-либо обновления, и юзера тихо разлогинивало каждые -- 10 минут — см. README/SECURITY_AUDIT.md. Храним только SHA-256 хеш -- предъявляемого токена, никогда сырое значение. -- ===================================================================== DROP TABLE IF EXISTS auth_sessions; CREATE TABLE refresh_sessions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, token_hash VARCHAR(64) NOT NULL UNIQUE, -- hex(sha256(refresh_token)) user_agent VARCHAR(255), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), expires_at TIMESTAMPTZ NOT NULL, revoked_at TIMESTAMPTZ ); CREATE INDEX idx_refresh_sessions_user ON refresh_sessions(user_id); -- ===================================================================== -- Поля, недостающие для полноценного TunnelConfig в GET /nodes/routing: -- статический публичный ключ ноды (для клиентского пиннинга) и домен-декой -- для ClientHello (см. src/modules/nodes/controller.rs::get_node_routing). -- ===================================================================== ALTER TABLE vpn_nodes ADD COLUMN public_key TEXT, ADD COLUMN sni_domain VARCHAR(255);