Arquitectura d’Autenticació/Autorització de Decision Gate + Divulgació
Audience: Engineers implementing or reviewing MCP authentication, Audiència: Enginyers que implementen o revisen el comportament d’autenticació, autorització i divulgació d’errors de MCP.
Taula de continguts
- Visió Executiva
- Context de la sol·licitud i identitat
- Modes d’autenticació
- Autenticació d’eines (Llista blanca)
- Autorització del llogater (connectable)
- Mesura d’ús i quotes (Plugable)
- Esdeveniments d’Auditoria d’Autenticació
- Postura de divulgació (JSON-RPC + HTTP)
- Limitació de Taxa i Respostes d’Overload
- File per Fitxer Referència Creuada
Executive Overview
Decision Gate MCP aplica una autenticació i autorització estrictes, amb fallada tancada, per a les crides d’eines. L’autenticació és conscient del transport (stdio, HTTP, SSE) i es configura a través de server.auth. L’autorització s’aplica per cada crida d’eina mitjançant DefaultToolAuthz, amb llistes d’eines opcionals. Una capa d’autorització de llogater separada i plugable pot aplicar l’abast de llogater/espai de noms abans de l’execució de l’eina. Les eines de cicle de vida tipades (typed_providers_import/register/list/get/activate/deprecate) ara requereixen camps d’abast de llogater/espai de noms explícits i sempre ruten el context d’abast a través de verificacions d’autorització + espai de noms + mesurament d’ús. typed_providers_import a més requereix un mapeig explícit de credential_bindings per a esquemes OpenAPI assegurats (locator + value_render), i el registre/importació d’artefactes tipats rebutja perfils d’execució que no són typed-runtime-v4. La reforçació de la importació primer en projecció s’aplica a aquesta frontera: les respostes complexes d’objecte/array JSON sense x-decision-gate.projections són rebutjades, i els camps de sol·licitud llegats eliminats (com ara response_projection_mode) són rebutjats com a paràmetres no vàlids. La resolució de credencials d’execució tipades es basa en localitzadors (secret:// i env:// tancats) amb el backend de secret local xifrat OSS com a resolutor per defecte. Els valors de credencials es desant crues; s’aplica un formatatge de cable determinista a partir de la metadada value_render d’autenticació tipada en temps d’execució. Les crides amb abast de proveïdor ara també passen provider_id a la costura d’autorització del llogater quan està disponible (eines de cicle de vida tipades i evidence_query), habilitant decisions RBAC a nivell de proveïdor en autoritzadors d’empresa sense bifurcacions OSS. Les decisions d’autorització emeten esdeveniments d’auditoria estructurats, i els errors de sol·licitud es mapejen a codis d’error JSON-RPC estables i codis d’estat HTTP per a una divulgació determinista i etiquetatge de mètriques. F:crates/decision-gate-mcp/src/auth.rs L293-L372 F:crates/decision-gate-mcp/src/tools/router.rs L1436-L1454 F:crates/decision-gate-mcp/src/tools/router.rs L2857-L2878 F:crates/decision-gate-mcp/src/server.rs L1984-L2017
Context de la sol·licitud i identitat
Context de la Sol·licitud
Les sol·licituds entrants es normalitzen en un RequestContext que registra el transport, l’IP del peer, l’encapçalament d’autenticació, el subjecte del client i un identificador de sol·licitud opcional, així com metadades de correlació. Per als transports HTTP/SSE, el context es construeix a partir de l’encapçalament Authorization i l’encapçalament x-decision-gate-client-subject per a la identitat del proxy mTLS. Els identificadors de correlació proporcionats pel client arriben a través de x-correlation-id i es tracten com a entrada insegura: es validen estrictament i es rebutgen si són invàlids. El servidor sempre emet el seu propi x-server-correlation-id i el retorna en les respostes, proporcionant un identificador estable i auditable fins i tot quan els IDs dels clients falten o són rebutjats. F:crates/decision-gate-mcp/src/auth.rs L82-L173 F:crates/decision-gate-mcp/src/server.rs L993-L1072 F:crates/decision-gate-mcp/src/server.rs L1648-L1734
Identitat Principal
AuthContext captura el mètode d’autenticació més un subjecte explícit o una empremta digital del token de portador. Si una sol·licitud només local no té subjecte, el subjecte es configura com a stdio o loopback segons el transport. Per als tokens de portador, s’calcula una empremta digital sha256 i s’utilitza com a etiqueta d’identitat estable. F:crates/decision-gate-mcp/src/auth.rs L181-L216 F:crates/decision-gate-mcp/src/auth.rs L503-L517
Modes d’autenticació
El mode d’autenticació es configura mitjançant server.auth.mode amb llistes d’acceptació de suport:
local_only: s’accepta stdio; HTTP/SSE només s’accepten per a IPs de loopback.bearer_token: el bearer token ha de coincidir ambserver.auth.bearer_tokens.mtls: subject must be present inx-decision-gate-client-subjectand matchmtls: el subjecte ha d’estar present enx-decision-gate-client-subjecti coincidir ambserver.auth.mtls_subjectsquan estigui configurat.
Superfície de configuració:
server.auth.mode,bearer_tokens,mtls_subjects,allowed_tools.server.auth.mode,bearer_tokens,mtls_subjects,allowed_tools. F:crates/decision-gate-config/src/config.rs L789-L937
Detalls d’implementació:
- Local només rebutja HTTP/SSE no de retroalimentació.
- Bearer tokens are parsed with size and scheme validation; invalid/missing Els tokens de portador es processen amb validació de mida i esquema; els encapçalaments no vàlids/o que falten fallen en l’autenticació.
- mTLS requires a subject; unauthorized subjects are rejected. mTLS requereix un subjecte; els subjectes no autoritzats són rebutjats. F:crates/decision-gate-mcp/src/auth.rs L479-L552
Autenticació d’Eines (Llista Permesa)
L’autorització d’eines s’aplica per sol·licitud per DefaultToolAuthz. Si server.auth.allowed_tools està configurat, qualsevol eina que no estigui a la llista d’autoritzacions és rebutjada amb un error d’no autoritzat. Els noms d’eines no vàlids a la llista d’autoritzacions es tracten com una configuració de fallada tancada (llista d’autoritzacions buida). F:crates/decision-gate-mcp/src/auth.rs L293-L372
Els resultats de l’autorització de l’eina són emesos pel router d’eines:
AuthAuditEvent::alloweden cas d’èxitAuthAuditEvent::deniedon failure F:crates/decision-gate-mcp/src/tools/router.rs L3131-L3144 F:crates/decision-gate-mcp/src/auth.rs L379-L445
Autorització del llogater (connectable)
L’autorització de l’inquilí/espai de noms s’aplica mitjançant un ganxo TenantAuthorizer que es pot connectar. La implementació per defecte permet tot l’accés, però les implementacions empresarials poden proporcionar un autoritzador que vincula els principals amb els àmbits d’inquilí i espai de noms. L’autorització de l’inquilí s’executa després de les comprovacions de la llista d’eines permeses i abans de l’execució de l’eina. Les denegacions d’inquilí emeten esdeveniments d’auditoria dedicats (tenant_authz).
Referències d’implementació:
- Interfície d’autenticació del llogater: F:crates/decision-gate-mcp/src/tenant_authz.rs L29-L65
- Execució i emissió d’auditoria: F:crates/decision-gate-mcp/src/tools/router.rs L2857-L2935
Mesura d’Ús i Quotes (Connectables)
El mesurament d’ús i les comprovacions de quota són aplicades per un ganxo UsageMeter que es pot connectar. La implementació per defecte és un no-op, però les implementacions empresarials poden subministrar un mesurador que aplica quotes i registra l’ús de grau de facturació. Les comprovacions d’ús s’executen abans de l’execució de l’eina; les denegacions emeten esdeveniments usage_audit.
Referències d’implementació:
- Interfície de mesura d’ús: F:crates/decision-gate-mcp/src/usage.rs L28-L105
- Execució i emissió d’auditoria: F:crates/decision-gate-mcp/src/tools/router.rs L2937-L2999
Esdeveniments d’Auditoria d’Autenticació
Les decisions d’autenticació emeten esdeveniments d’auditoria JSON estructurats amb detalls sobre el transport, el subjecte, el mètode i la raó de fallada. El registre d’auditoria per defecte registra línies JSON a stderr; les proves poden utilitzar un registre sense operacions. F:crates/decision-gate-mcp/src/auth.rs L379-L445
Postura de divulgació (JSON-RPC + HTTP)
Divulgació de Feedback (scenario_next)
Les respostes scenario_next són només un resum per defecte. Els nivells de retroalimentació opcionals (trace, evidence) estan subjectes a la política server.feedback.scenario_next, amb verificacions de rol/subjecte resoltes a partir de server.auth.principals. La retroalimentació d’evidència encara es filtra a través de la política de divulgació d’evidències (els valors en brut poden ser esborrats llevat que s’autoritzi explícitament). F:crates/decision-gate-config/src/config.rs L452-L545 F:crates/decision-gate-mcp/src/tools/router.rs L2144-L2257
JSON-RPC Error Envelope
El servidor MCP respon amb codis d’error JSON-RPC i metadades estructurades (kind, retryable, request_id, retry_after_ms opcional). Els tipus d’error són etiquetes estables utilitzades per a mètriques i categorizació d’auditories. F:crates/decision-gate-mcp/src/server.rs L1961-L2043
Mapeig d’Errors (Errors de l’Eina)
Els errors de l’eina es mapegen a l’estat HTTP + codis d’error JSON-RPC:
| ToolError | HTTP | JSON-RPC Code | Message |
|---|---|---|---|
| NoAutenticat | 401 | -32001 | no autenticat |
| NoAutoritzat | 403 | -32003 | no autoritzat |
| ParamsInvàlids | 400 | -32602 | missatge proporcionat |
| ViolacióDeCapacitat | 400 | -32602 | codi: missatge |
| EinaDesconeguda | 400 | -32601 | eina desconeguda |
| Resposta massa gran | 200 | -32070 | missatge proporcionat |
| LimitatPerTaxa | 200 | -32071 | missatge proporcionat |
| NoTrobat | 200 | -32004 | missatge proporcionat |
| Conflicte | 200 | -32009 | missatge proporcionat |
| Prova | 200 | -32020 | missatge proporcionat |
| PlaDeControl | 200 | -32030 | missatge proporcionat |
| ExecutarPaquet | 200 | -32040 | missatge proporcionat |
| Intern | 200 | -32050 | missatge proporcionat |
| Serialització | 200 | -32060 | la serialització ha fallat |
Aquests mapeigs s’implementen en jsonrpc_error. F:crates/decision-gate-mcp/src/server.rs L1984-L2015
Divulgació d’Importació OpenAPI Tipada
typed_providers_import i el registre d’artefactes tipats retornen fallades deterministes InvalidParams per violacions de política/entrada:
- unsupported OpenAPI security constructs include explicit taxonomy metadata
(
unsupported_code, text de remediació) en missatges de rebuig; - els camps
credential_bindingsque falten i els mapes de esquema segur buits són rebutjats abans de la importació; - els perfils de runtime no-
typed-runtime-v4són rebutjats abans de la registració.
F:crates/decision-gate-mcp/src/tools/router.rs L3798-L3830 F:crates/decision-gate-mcp/src/tools/router.rs L5112-L5160 F:crates/decision-gate-mcp/src/tools/router.rs L5259-L5263
Capçalera del Repte d’Autenticació (RFC 6750)
Les respostes HTTP/SSE per a sol·licituds no autenticades inclouen un capçalera WWW-Authenticate amb un àmbit Bearer quan l’autenticació amb token Bearer està habilitada. Això s’alinea amb l’RFC 6750 i manté els desafiaments d’autenticació explícits sense filtrar detalls de validació del token. F:crates/decision-gate-mcp/src/auth.rs L46-L75 F:crates/decision-gate-mcp/src/server.rs L1706-L1718
Encapçalaments de Correlació
Les respostes HTTP/SSE sempre inclouen un x-server-correlation-id emès pel servidor. Si el client proporciona un x-correlation-id vàlid, es retorna. Els IDs de correlació del client invàlids són rebutjats abans de l’anàlisi de la sol·licitud i no es retornen. El rebuig de correlació invàlida utilitza HTTP 400 amb el codi d’error JSON-RPC -32073 (invalid_correlation_id). F:crates/decision-gate-mcp/src/server.rs L993-L1072 F:crates/decision-gate-mcp/src/server.rs L1648-L1749
Errors en la Anàlisi de Sol·licituds
Versions de JSON-RPC no vàlides, mètodes desconeguts i cossos de sol·licitud mal formats són rebutjats amb codis d’error estàndard de JSON-RPC i HTTP 400. F:crates/decision-gate-mcp/src/server.rs L1505-L1583
Limitació de Taxa i Respostes d’Overload
El servidor imposa:
- Inflight request limits (reject with 503 and
-32072, kindinflight_limit, codi de raódg.server.inflight_limit_exhausted. - Rate-window limiting (reject with 429 and
-32071, kindrate_limited, reason codedg.server.rate_limit_window_exhausted, including retry-after pistes). - Rate-limiter capacity saturation (reject with 503 and
-32074, kindrate_limiter_capacity, reason codedg.server.rate_limiter_capacity_exhausted). - Límits de mida de càrrega útil (rebutjar amb 413 i
-32070).
Els controls d’execució de sortida del proveïdor tipat són separats dels controls d’entrada de MCP i s’apliquen mitjançant una política de temps d’execució tipada (outbound_max_inflight, reintents limitats/retrasos).
Aquests errors es reporten amb metadades d’error JSON-RPC estructurades i es marquen com a reintents quan és apropiat. F:crates/decision-gate-mcp/src/server.rs L1688-L1760 F:crates/decision-gate-mcp/src/server.rs L2150-L2250 F:crates/decision-gate-providers/src/typed.rs L448-L463 F:crates/decision-gate-providers/src/typed.rs L958-L980
File per Fitxer Referència Creuada
| Àrea | Fitxer | Notes |
|---|---|---|
| Superfície de configuració d’autenticació | crates/decision-gate-config/src/config.rs | Modes d’autenticació, llistes blanques de tokens/subjectes, llista blanca d’eines. |
| Motor de polítiques d’autenticació | crates/decision-gate-mcp/src/auth.rs | DefaultToolAuthz, modes d’autenticació, esdeveniments d’auditoria, anàlisi de tokens. |
| Integració d’autenticació d’eines | crates/decision-gate-mcp/src/tools/router.rs | Autenticació per trucada + emissió d’auditoria. |
| Interfície d’autenticació de llogater | crates/decision-gate-mcp/src/tenant_authz.rs | Seam d’autenticació de llogater/namespace connectable. |
| Interfície de mesurament d’ús | crates/decision-gate-mcp/src/usage.rs | Seam de mesurament d’ús connectable + aplicació de quotes. |
| Divulgació JSON-RPC | crates/decision-gate-mcp/src/server.rs | Mapeig d’errors i codis de resposta. |