bc632f9d56
/mcp-Bearer больше не пинит тип к ACCESS. Новый framework-free примитив
verifyMcpBearer верифицирует подпись ОДИН раз (bindMcpBearerVerifier пинит
allowlist {ACCESS, API_KEY}) и роутит:
- API_KEY → сперва биндинг к воркспейсу инстанса (чужой воркспейс — отказ), затем
общий row-check ApiKeyService.validate. HMAC-верификация (микросекунды) вместо
bcrypt, это НЕ попытка логина — Basic-путь и анти-брутфорс-лимитер не
затрагиваются (фикс удушения параллельных чтений агентов).
- ACCESS → прежний verifyBearerAccess (session-active + not-disabled), которому
передаётся замыкание над уже проверенным payload, так что «проверить один раз»
и «helper без изменений» сосуществуют.
Bearer-нога resolveMcpSessionConfig униформизирована: любой отказ авторизации →
единый generic-401 (анти-enumeration, класс отказа не течёт в тело), а
непредвиденная (инфра) ошибка ПРОБРАСЫВАЕТСЯ (→5xx), не маскируется под 401.
McpService получает ApiKeyService; McpModule импортирует ApiKeyModule.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>