MCP OAuth Client Credentials vs Authorization Code: який flow обрати
Практичне порівняння delegated authorization code для дій користувача та client credentials для workload identity у background services, CI/CD і server-to-server automation.
Зміст статті
- 01Коротка відповідь: flow визначає власника повноваження
- 02Матриця вибору: user delegation проти workload identity
- 03Не плутайте client registration із client credentials grant
- 04Scope, audience і domain policy мають працювати разом
- 05Secrets, assertions і ротація без прихованої безстрокової сесії
- 06Threat model і негативні тести для двох flows
- 07Впровадження: два lanes, один policy та observability control plane
Передумови
Коротка відповідь: flow визначає власника повноваження
Обирайте authorization code, коли MCP client діє від імені конкретної людини: користувач входить, бачить consent, а token представляє делеговане право на визначений MCP resource. Обирайте OAuth Client Credentials extension, коли ініціатором є workload — scheduler, CI job, daemon або backend service — і в операції немає користувача, чию згоду треба представити. API key не є третім рівноцінним flow: це довгоживучий shared secret без стандартної token audience, discovery та scope lifecycle.
Головне питання не «де простіше отримати token», а «чия authority виконує дію». Authorization code не треба маскувати під service account через технічного користувача, а client credentials не можна використовувати для непомітної підміни user consent. Якщо workflow іноді запускає людина, а іноді automation, моделюйте два principals і дві policy paths, навіть якщо вони викликають той самий MCP tool.
- Людина присутня і делегує доступ → authorization code + PKCE.
- Workload працює без людини → OAuth Client Credentials extension.
- Локальний stdio server → credentials із захищеного host environment, не HTTP OAuth flow.
- Один tool для user і service → різні principals, scopes, budgets та audit labels.
- Наслідкова дія → окремий policy gate незалежно від authentication.
architecture
Карта системи: MCP OAuth Client Credentials vs Authorization Code: який flow обрати
comparison
Критерії вибору й порівняння
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Контрольна теза з матеріалу статті.
Матриця вибору: user delegation проти workload identity
Authorization code з PKCE прив'язує grant до user interaction і підходить desktop, web та conversational clients, де користувач має зрозуміти ресурс і requested scopes. Protected Resource Metadata та authorization-server discovery допомагають знайти правильний issuer; resource indicator і audience validation обмежують token конкретним MCP server. Scope challenge дозволяє просити додаткове право лише тоді, коли operation його справді потребує.
Client credentials представляє application, а не людину. Офіційна MCP extension називає background services, CI/CD, server-to-server integrations і daemons типовими сценаріями. Вона підтримує client secret або JWT bearer assertion; documentation рекомендує assertion, коли це можливо, бо private signing key не передається token endpoint. Проте workload усе одно потребує owner, мінімальних scopes, rotation, egress policy і kill switch.
- Principal → user subject для authorization code; application subject для client credentials.
- Interaction → browser/consent потрібні першому flow; другий працює headless.
- Credential → PKCE-bound code проти secret або signed JWT assertion.
- Revocation → user grant lifecycle проти workload credential lifecycle.
- Audit → actor + client + user проти service + job/run + owner.
Не плутайте client registration із client credentials grant
Client ID, client metadata і client credential відповідають на питання, який client звертається до authorization server; grant type відповідає на питання, чиє право він отримує. У delegated flow confidential client може мати власний secret або private_key_jwt і водночас використовувати authorization code від імені user. Сам факт наявності client secret не перетворює цей flow на client credentials.
У MCP 2026-07-28 для interactive authorization пріоритетні pre-registration і Client ID Metadata Documents; Dynamic Client Registration лишився backward-compatible fallback. Це не скасовує окрему Client Credentials extension. Реєструйте allowed grant types явно, не дозволяйте одному client_id довільно перемикатися між user і workload authority, а credentials прив'язуйте до перевіреного authorization-server issuer.
Scope, audience і domain policy мають працювати разом
Для обох flows MCP server перевіряє signature або introspection result, issuer, audience/resource, expiry і required scopes. Client credentials token не має user subject, тому server не повинен вигадувати tenant або owner із tool argument. Service-to-tenant mapping зберігається в authorization data, а high-risk tools можуть бути недоступними workload principals або вимагати signed job context і зовнішнє approval.
Scope — це coarse capability, не завершена бізнес-авторизація. `invoices.write` не відповідає, до якої legal entity, суми або стану invoice є доступ. Після token validation policy engine перевіряє object ownership, environment, parameters, time window, budget і separation of duties. MCP server ніколи не пересилає отриманий MCP token до downstream API: для upstream system він отримує окремий audience-bound credential.
Secrets, assertions і ротація без прихованої безстрокової сесії
Для client credentials простий client secret зберігайте в secret manager, видавайте конкретному workload і регулярно ротувайте; не вбудовуйте його в repository, container image, prompt або MCP configuration, яку може прочитати модель. JWT bearer assertion з коротким `exp`, унікальним `jti` та правильною `aud` зменшує передачу long-lived secret, але private key усе одно потребує захищеного signing boundary та rotation.
Access tokens кешуйте за issuer, client, resource і scope set, ніколи не між tenants або environments. На revocation чи deployment rollback зупиняйте нові token requests, відкликайте або ротувайте credential і завершуйте in-flight consequential actions через reconciliation. Старий pod не повинен зберігати authority лише тому, що token ще формально не expired.
Threat model і негативні тести для двох flows
Delegated path тестуйте на redirect URI substitution, PKCE downgrade, issuer mix-up, consent bypass, excessive scopes, token theft і cross-user cache. Workload path — на leaked secret, replay assertion, wrong token-endpoint audience, unauthorized grant type, cloned deployment, cross-environment credential reuse та job context spoofing. Для обох обов'язкові wrong MCP audience, expired token, insufficient scope, tenant mismatch і token passthrough.
Failure має бути fail-closed і діагностичним. `invalid_token`, `insufficient_scope` та domain-policy denial — різні стани; automation не повинна відповідати на них нескінченним refresh або scope escalation. Audit записує decision ID, principal type, workload, issuer, resource, scopes, tool, hashed job/run reference і outcome без token, secret або повного assertion.
Впровадження: два lanes, один policy та observability control plane
Почніть з inventory MCP tools і позначте allowed principal types: user-only, workload-only або both. Далі створіть окремі clients, scopes і policy rules для interactive та headless lanes. Проведіть negative tests, запустіть read-only workload canary, виміряйте denial/retry/token-refresh signals, а writes відкривайте лише після idempotency, exact-action constraints і authoritative postcondition check.
Rollback для delegated lane вимикає client або scope, відкликає grants і повертає попередню policy version. Для workload lane додатково зупиняє scheduler/deployment, ротирує credential і звіряє незавершені job outcomes. Спільний dashboard показує token failures, scope challenges, denied tools, credential age, issuer/audience mismatch і consequential actions за principal type — без змішування user activity з automation.
Практичні приклади
Один billing MCP server для аналітика і nightly job
Аналітик через authorization code і PKCE отримує delegated `invoices.read` після consent та бачить лише дозволену legal entity. Nightly worker використовує Client Credentials extension із signed JWT assertion і окремим `reconciliation.run` scope. Policy дозволяє job читати ledger і створювати exception report, але не approve payment; timeout звіряється з run ledger перед retry.
FAQ
Чи client secret автоматично означає client credentials flow?
Ні. Confidential client може автентифікувати себе secret або private_key_jwt і використовувати authorization code від імені user. Grant type та represented principal перевіряють окремо.
Чи можна використовувати client credentials для персональних даних?
Лише якщо policy явно надає workload доступ за законною метою і tenant/object boundary. Такий token не представляє user consent і не повинен маскуватися під людину.
Що краще для CI/CD: client secret чи JWT assertion?
Офіційна extension рекомендує JWT bearer assertion, коли можливо. Він не передає private key і може бути короткоживучим, але signing key, audience, replay protection і rotation усе одно контролюють.
Чи достатньо API key для remote MCP server?
Shared key не дає стандартного OAuth discovery, audience-bound token і grant lifecycle. Для remote user або workload scenarios використовуйте відповідний OAuth flow.
Пов’язані матеріали
Authorization у MCP визначає, хто й за яких умов може звертатися до захищених capabilities. Стаття пояснює OAuth-базований потік, resource indicators, audience binding, consent, захист токенів і перевірку повноважень на кожній операції.
Розробка MCP serverMCP server перетворює дані й операції системи на типізовані ресурси, промпти та інструменти. Матеріал показує, як спроєктувати вузький контракт, валідовувати запити, обмежувати повноваження і тестувати сервер незалежно від конкретної моделі.
Розробка MCP clientMCP client відкриває capabilities серверів для AI-застосунку та відповідає за discovery, consent, маршрутизацію і безпечне виконання. Розглядаємо життєвий цикл сесії, роботу зі схемами, ізоляцію результатів, сумісність і відмовостійкість.
Secrets management в AI-системахAI-системи торкаються model APIs, vector stores, datasets і tools, тому витік одного ключа може мати широкий вплив. Розбираємо inventory, least privilege, короткі identity, rotation, redaction, аудит та incident response.
Безпека AI-агентівБезпека AI-агентів — практичний розбір production-архітектури: зменшення наслідків помилкового або атакованого рішення через системні межі довіри та мінімальні повноваження. Матеріал охоплює контракти, межі повноважень, failure modes, оцінювання та контрольований rollout.
Тестування MCP-інтеграційТестування MCP-інтеграцій має перевіряти не лише happy path, а й negotiation, schema compatibility, authorization, недовірені результати та невизначені side effects. Будуємо багаторівневу стратегію від unit-тестів до end-to-end eval.
Observability для MCPObservability для MCP пов’язує protocol session, запит моделі, tool call, policy-рішення і downstream effect. Матеріал визначає корисні метрики, безпечні traces, кореляцію помилок, SLO та діагностику без витоку prompt, токенів і персональних даних.