feat: персональные MCP-ключи (канон handbook mcp.md)
- таблица mcp_tokens: sha256-хэш (unique) + хвост-хинт, снейпшот roles
  владельца на момент выпуска; миграции users.system_role/users.blocked
- выдача только из cookie-сессии: GET/POST /me/mcp_tokens (plaintext
  ровно один раз, ≥10 активных → 409), ревок вместо архива; админ-роуты
  для всех ключей; rate-limit на выдачу (5 за 10 мин)
- гард /mcp — require_mcp: Bearer mcp_* | статический GHARD_ADMIN_TOKEN |
  cookie; отозванный/заблокированный — тот же 401 (причина не раскрывается)
- вебхуки user.blocked/deleted/archived → users.blocked=1 + ревок ключей
  владельца; разблокировка — при следующем успешном логине; SSO-логаут
  ключи не трогает
1 parent b6080d0 commit 14007e0774f8a1ec27ecac4805296fea07acd1dc
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 1 hour ago
Showing 8 changed files
View
panel/backend/app/api/auth_routes.py
View
panel/backend/app/api/mcp_tokens.py 0 → 100644
View
panel/backend/app/auth.py
View
panel/backend/app/db.py
View
panel/backend/app/main.py
View
panel/backend/app/mcp.py
View
panel/backend/app/schema.sql
View
panel/backend/app/security.py