|
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-логаут ключи не трогает |
|---|
|
|
| panel/backend/app/api/auth_routes.py |
|---|
| panel/backend/app/api/mcp_tokens.py 0 → 100644 |
|---|
| panel/backend/app/auth.py |
|---|
| panel/backend/app/db.py |
|---|
| panel/backend/app/main.py |
|---|
| panel/backend/app/mcp.py |
|---|
| panel/backend/app/schema.sql |
|---|
| panel/backend/app/security.py |
|---|