-- Шаг 0.6 (production-готовность): хэширование refresh/reset-токенов в БД. -- Plain-токены больше не хранятся: в БД пишется только sha256-хэш (hex, 64 символа). -- Refresh-сессии живут в user_sessions, reset-токены — в users (отдельных таблиц нет). -- -- ВАЖНО: миграция инвалидирует ВСЕ существующие сессии и reset-ссылки -- (глобальный разлогин). Legacy-колонки с plain-токенами НЕ удаляются -- (отложено на отдельную миграцию), но больше не пишутся. ALTER TABLE user_sessions ADD COLUMN IF NOT EXISTS refresh_token_hash VARCHAR(64); ALTER TABLE user_sessions ADD COLUMN IF NOT EXISTS parent_refresh_token_hash VARCHAR(64); ALTER TABLE user_sessions ADD COLUMN IF NOT EXISTS replaced_by_token_hash VARCHAR(64); ALTER TABLE users ADD COLUMN IF NOT EXISTS reset_password_token_hash VARCHAR(64); -- Глобальный разлогин: старые строки содержат plain-токены и без хэша бесполезны. DELETE FROM user_sessions; UPDATE users SET reset_password_token = NULL, reset_password_expires = NULL WHERE reset_password_token IS NOT NULL; -- refresh_token больше не пишется — снимаем NOT NULL (саму колонку оставляем). ALTER TABLE user_sessions ALTER COLUMN refresh_token DROP NOT NULL; ALTER TABLE user_sessions ALTER COLUMN refresh_token_hash SET NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS user_sessions_refresh_token_hash_key ON user_sessions (refresh_token_hash); CREATE INDEX IF NOT EXISTS user_sessions_parent_refresh_token_hash_idx ON user_sessions (parent_refresh_token_hash); CREATE INDEX IF NOT EXISTS users_reset_password_token_hash_idx ON users (reset_password_token_hash);