By the end of this guide, you will have a Maverics Orchestrator enforcing authorization policies on every request — evaluating user attributes, roles, and context to determine whether access is allowed.
Before diving in, it helps to understand the distinction between these two concepts because they are often confused. Authentication answers the question “Who is this user?” — it verifies identity through credentials like passwords, OIDC tokens, or SAML assertions. Authorization answers the question “What is this user allowed to do?” — it checks whether an authenticated user has permission to access a specific resource or perform a specific action.The Maverics Orchestrator handles both. Your authentication configuration verifies user identity. The authorization policies in this guide control what those authenticated users can access. Authentication always happens first — you cannot authorize a user you have not identified.
A running Maverics Orchestrator — If you have not installed it yet, follow the Quick Start guide first.
An identity provider connected — Your Orchestrator should be authenticating users against an identity provider. The Quick Start or SSO guides cover this.
Users authenticating successfully — Before adding authorization, confirm that users can log in and access your applications without policy restrictions.
The Orchestrator provides different authorization mechanisms depending on the mode you are running. Choose the approach that matches your deployment:
HTTP Proxy — Uses location-based policies with declarative and/or rules per URL path. Each policy binds to a route and evaluates user attributes against conditions you define. See HTTP Proxy authorization below.
OIDC Provider and SAML Provider — Uses app-level authorization with declarative rules. OIDC Provider also supports OPA token minting policies. Authorization is configured on the app itself rather than per-location. See OIDC and SAML Provider authorization below.
MCP Bridge and MCP Proxy (AI Identity Gateway) — Uses OPA-based inbound authorization exclusively. Policies written in Rego evaluate per-tool invocations with access to MCP-specific context. See OPA Authorization (AI Identity Gateway) below.
LDAP Provider — Handles authorization entirely through Service Extensions. There are no declarative authorization rules. See the Service Extensions reference for the authenticateSE and searchSE hooks.
In HTTP Proxy mode, authorization is configured per-location within the policies array on each app. Each policy specifies a URL path, the identity providers that handle authentication, and optionally the authorization rules that control access after authentication.
1
Define authentication policy binding
Before configuring authorization rules, you need a policy that binds your identity provider connectors to application routes.
Console UI
Configuration
Console UI documentation is coming soon. This section will walk you
through configuring this component using the Maverics Console’s visual
interface, including step-by-step screenshots and field descriptions.
Policy model overview in Maverics Console
Define policies on your app with authentication connector bindings:
The idps array references connectors by name. The Orchestrator will redirect unauthenticated users to the first listed identity provider for login.
2
Define authorization rules
Authorization rules determine whether an authenticated user is allowed to access a resource. Rules support nested and/or conditions with four comparison operators: equals, notEquals, contains, and notContains.The Orchestrator supports multiple access control models, and you can combine them:RBAC (Role-Based Access Control) assigns permissions based on roles. A user has one or more roles (like “admin,” “editor,” or “viewer”), and each role grants access to specific resources. RBAC is straightforward and works well when your access patterns align with job functions.ABAC (Attribute-Based Access Control) makes decisions based on attributes — properties of the user, the resource, or the request context. Attributes can include things like department, location, or any claim from the identity provider.PBAC (Policy-Based Access Control) makes decisions based on centralized policies evaluated against request context, user attributes, and environmental conditions. PBAC generalizes RBAC and ABAC by expressing access rules as policies that can incorporate any combination of roles, attributes, and contextual factors.External PDP (Policy Decision Point) integration delegates authorization decisions to an external policy engine — such as OPA, Cedar, or a custom PDP — for organizations that maintain centralized policy engines across multiple systems.
Console UI
Configuration
Console UI documentation is coming soon. This section will walk you
through configuring this component using the Maverics Console’s visual
interface, including step-by-step screenshots and field descriptions.
Policy definition in Maverics Console
Allow all authenticated users (simplest authorization):
In this example: the first rule requires the user to be an admin AND a member of the managers group. The second rule allows GET requests OR users not in the restricted department. Both rules must pass (rulesAggregationMethod: "and").Operators:
Operator
Description
Operands
equals
Exact string match
2 operands
notEquals
Inverse exact match
2 operands
contains
Substring or membership check
2 operands
notContains
Inverse substring/membership
2 operands
Operand formats:
{{ connector.attribute }} — claim from a named connector (e.g., {{ azure.groups }})
Start with broad policies and refine as needed. A common pattern is to
require authentication on all routes first, then add access control
restrictions to specific paths. You can always tighten access later
without disrupting users who already have the right permissions.
3
Add programmatic authorization (optional)
For authorization logic that goes beyond declarative rules, HTTP Proxy mode supports two Service Extension hooks:
isAuthorizedSE runs after declarative rule evaluation and can override or supplement the result. This lets you implement dynamic authorization checks — for example, querying an external system, checking time-of-day restrictions, or applying business logic that cannot be expressed as and/or rules. Configure at policies[].authorization.isAuthorizedSE. See Service Extensions.
handleUnauthorizedSE customizes the response when authorization is denied. Instead of the default 403 Forbidden page, you can render a custom error page, redirect to a request-access workflow, or log additional context. Configure at apps[].handleUnauthorizedSE. This hook is mutually exclusive with the unauthorizedPage setting. See Service Extensions.
In OIDC Provider and SAML Provider modes, authorization is configured at the app level (apps[].authorization) rather than per-location. The same declarative rule syntax is available — allowAll, rules, and rulesAggregationMethod — but the configuration lives directly on the app instead of inside a policies[] block.
1
Configure declarative rules
Console UI
Configuration
Console UI documentation is coming soon. This section will walk you
through configuring this component using the Maverics Console’s visual
interface, including step-by-step screenshots and field descriptions.
The rule syntax (and, or, operators, operand formats) is the same as HTTP Proxy. The only difference is the config location: apps[].authorization instead of apps[].policies[].authorization.
OIDC Provider mode supports OPA policies for token minting authorization. This provides a governance layer over which tokens the Orchestrator issues — you can enforce policies on token exchange based on user attributes, client identity, or environmental conditions. This does not apply to SAML Provider mode, which issues assertions rather than tokens.
maverics.yaml
apps: - name: my-oidc-app type: oidc authorization: tokenMinting: accessToken: policies: - name: token-governance rego: | package orchestrator default result := {"allowed": true} # Deny tokens requested with the client_credentials grant type result := {"allowed": false, "internal_message": "client_credentials not permitted"} { input.request.oauth.grant_type == "client_credentials" }
OPA token minting policies must define a result object containing an allowed field. The Orchestrator denies token issuance if allowed is false. You can optionally include internal_message (logged server-side) and external_message (returned to the client) fields. See OPA Policy Output Schema for the full output format.
OIDC app example: enforce scope reduction on token exchange
The following policy ensures that scopes are only reduced during token exchange flows. The requested scopes in the token exchange request must be a subset of the scopes in the subject_token. All other grant types are allowed without restriction.
policy.rego
package orchestratordefault result["allowed"] := false# Allow all non-token-exchange grant types.result["allowed"] if { input.request.oauth.grant_type != "urn:ietf:params:oauth:grant-type:token-exchange"}# Parse scopes from space-separated strings into sets.requested_scopes := {s | some s in split(input.request.oauth.scope, " "); s != ""}subject_scopes := {s | some s in split(input.request.oauth.subject_token.claims.scope, " "); s != ""}# For token exchange grants, allow if requested scopes are a subset of subject token scopes.result["allowed"] if { input.request.oauth.grant_type == "urn:ietf:params:oauth:grant-type:token-exchange" print("requested_scopes:", requested_scopes) print("subject_scopes:", subject_scopes) count(requested_scopes - subject_scopes) == 0}result["internal_message"] := "requested scopes exceed subject_token scopes" if { not result.allowed}result["external_message"] := "invalid_scope" if { not result.allowed}
3
Add programmatic authorization (optional)
The isAuthorizedSE Service Extension hook is also available in OIDC Provider and SAML Provider modes. Configure at apps[].authorization.isAuthorizedSE. See Service Extensions.
In MCP Bridge and MCP Proxy modes (AI Identity Gateway), OPA is the only authorization mechanism. There are no declarative and/or rules. All authorization is handled through Rego policies that evaluate per-tool invocations with access to MCP-specific context such as tool name and arguments.Configure OPA via authorization.inbound.opa with a policy name and either file (path to a .rego file) or inline rego.
1
Configure MCP app inbound authorization policies
Console UI
Configuration
Console UI documentation is coming soon. This section will walk you
through configuring this component using the Maverics Console’s visual
interface, including step-by-step screenshots and field descriptions.
OPA policy configuration in Maverics Console
Inline OPA policy:
maverics.yaml
authorization: inbound: type: opa opa: name: my-auth-policy rego: | package orchestrator default result := {"allowed": false} # Allow the listUsers tool result := {"allowed": true} { input.request.mcp.type == "tool" input.request.mcp.tool.params.name == "listUsers" } # Allow the getUser tool result := {"allowed": true} { input.request.mcp.type == "tool" input.request.mcp.tool.params.name == "getUser" }
OPA policies must define a result object containing an allowed field. The Orchestrator denies the request if allowed is false. You can optionally include internal_message (logged server-side) and external_message (returned to the client) fields. See OPA Policy Output Schema for the full output format.
The input schema varies by policy type. Connection policies receive only the HTTP request context; inbound and listing policies additionally receive input.request.mcp with the request type in mcp.type.Connection admission — evaluated by the connection policy when the proxy establishes a new upstream session. No mcp context is present because no tool has been invoked yet:
Tool listing (mcp.type: "tools_list") — evaluated by the listing policy once per tool during a tools/list request. The policy runs for each tool individually; tools the policy denies are removed before the response reaches the MCP client:
The following policy grants access to the get_ticket_price tool only if the Authorization header contains a JWT with the tickets:read scope. All other tools and requests are denied by default.
policy.rego
package orchestrator# Default deny policy - all requests are denied unless explicitly alloweddefault result["allowed"] := false# Decode the bearer token's claims. jwt.parse_bearer strips the "Bearer "# prefix and returns the payload, or undefined if the header is absent or# does not carry a JWT -- in which case every rule below fails and the# default deny applies.jwt_payload := jwt.parse_bearer(input.request.http.headers.Authorization)# Allows access to the get_ticket_price tool if the token contains# the tickets:read scope. Logs the tool name, client ID, and subject# for audit purposes.result["allowed"] if { print("request made to tool: ", input.request.mcp.tool.params.name) input.request.mcp.tool.params.name == "get_ticket_price" print("request made with client of: ", jwt_payload.client_id) contains(jwt_payload.scope, "tickets:read") print("access granted to subject:", jwt_payload.sub)}result["internal_message"] := "access is only permitted to the 'get_ticket_price' tool with tickets:read scope" if { not result.allowed}result["external_message"] := "unauthorized, contact support@example.com" if { not result.allowed}
The following policy gates upstream session establishment to bearers whose JWT contains a custom permitted_mcp_servers claim that includes the target server name. An IdP stamps this claim with the list of MCP servers the agent is authorized to reach; the policy checks membership before the session is opened. Because the admission decision is sticky for the lifetime of the session, this check runs once at connect time rather than on every tool call.
connection.rego
package orchestratordefault result["allowed"] := falsejwt_payload := jwt.parse_bearer(input.request.http.headers.Authorization)result["allowed"] if { "mission-control" in jwt_payload.permitted_mcp_servers}result["internal_message"] := "bearer token does not permit access to this MCP server" if { not result["allowed"]}result["external_message"] := "unauthorized: MCP server access not granted" if { not result["allowed"]}
Tool Filtering example: allowlist tools exposed to the MCP client
The following policy exposes only the tools in the permitted set. The MCP client receives only these tools in its tools/list response — everything else is hidden, reducing the capabilities available to the AI agent.
listing.rego
package orchestratordefault result["allowed"] := false# Tools visible to downstream MCP clientsallowed_tools := {"listUsers", "getUser", "searchUsers"}result["allowed"] if { input.request.mcp.type == "tools_list" input.request.mcp.response.tools_list.name in allowed_tools}result["internal_message"] := "tool is not in the allowed set" if { not result["allowed"]}
The following policy exposes a different set of tools depending on the agent’s JWT scopes. ticketService:write is a superset of ticketService:read: agents with only ticketService:read see read-only tools; agents with ticketService:write see both read and write tools. This narrows each agent’s attack surface to exactly what it needs.
listing.rego
package orchestratordefault result["allowed"] := falsejwt_payload := jwt.parse_bearer(input.request.http.headers.Authorization)# Read-only tools available to agents with ticketService:read or ticketService:writeread_tools := {"listTickets", "getTicket", "searchTickets"}# Write tools restricted to agents with the ticketService:write scopewrite_tools := {"createTicket", "updateTicket", "closeTicket"}result["allowed"] if { input.request.mcp.type == "tools_list" input.request.mcp.response.tools_list.name in read_tools some s in ["ticketService:read", "ticketService:write"] contains(jwt_payload.scope, s)}result["allowed"] if { input.request.mcp.type == "tools_list" input.request.mcp.response.tools_list.name in write_tools contains(jwt_payload.scope, "ticketService:write")}result["internal_message"] := "tool not permitted for this agent's scope" if { not result["allowed"]}
In addition to the standard OPA built-in functions, the Orchestrator registers its own built-ins. These are available in every OPA policy the Orchestrator evaluates — OIDC token minting, MCP connection, MCP inbound, and MCP tool filtering.
Decodes the claims from a bearer token in a single call, replacing the startswith / substring / io.jwt.decode sequence that policies would otherwise need to extract a JWT from an Authorization header.
jwt.parse_bearer(header_value)
Parameter
Type
Description
header_value
String
The full Authorization header value, including the Bearer scheme — typically input.request.http.headers.Authorization.
Returns an object containing the token’s payload claims.The auth-scheme is matched case-insensitively, per RFC 6750 section 2.1, so Bearer, bearer, and BEARER are all accepted. The credentials that follow are decoded exactly as sent.Usage:
Undefined resultsThe function returns undefined — rather than an error — when it cannot produce claims. This happens when:
The Authorization header is missing or empty.
The header does not use the Bearer auth-scheme (for example, Basic).
The value after the scheme is not a well-formed signed JWT.
The JWT payload is not a JSON object.
Because an undefined value makes any rule referencing it fail, a policy with a default result["allowed"] := false rule denies the request in all of these cases. This is the recommended pattern — write the default deny and let undefined claims fall through to it.
jwt.parse_bearer decodes the token payload without verifying its signature, its expiry, or any other claim. It is a parsing helper, not a validation step — a policy that trusts its output alone will accept a forged token.Token trust is established elsewhere. Configure mcpProvider.authorization.oauth with servers[].tokenValidation so the Orchestrator validates the bearer token before the request reaches your policy. That OAuth block is optional — if it is absent, no token validation happens and a policy reading these claims is trusting unverified input. If you need to verify a signature inside the policy itself, use OPA’s io.jwt.decode_verify instead.
All OPA policies — whether for OIDC token minting or MCP inbound authorization — must return a result object with the following structure:
{ "result": { "allowed": true, "internal_message": "user does not have necessary group membership: missing admin membership", "external_message": "unauthorized" }}
Field
Required
Description
result.allowed
Yes
Whether access should be granted (true) or denied (false)
result.internal_message
No
Details about the decision for server-side logs only. Not returned to clients.
result.external_message
No
Details returned to the client and also logged. Use for user-facing error messages.
Use print() statements in your Rego policies to emit debug output to Orchestrator logs. This is useful for tracing which rules matched and inspecting input values during policy development.
With policies defined and applied, test that they work as expected by making requests as users with different roles and attributes. Testing both the “allowed” and “denied” paths confirms that your policies are enforced correctly.
1
Start the Orchestrator
Start (or restart) the Orchestrator to load your policy configuration:
maverics -config /etc/maverics/maverics.yaml
2
Verify allowed access
Test with a user who should have access:
Log in as a user whose roles or attributes satisfy the policy conditions
Navigate to the protected resource — you should see the application content
Verify the request reached your upstream application (check application logs)
3
Verify denied access
Test with a user who should be denied:
Log in as a user who does not meet the policy conditions
Navigate to the same resource — you should receive a 403 Forbidden response
Verify the request did not reach your upstream application
Success! Your Orchestrator is enforcing authorization policies.
Requests from authorized users proceed to your applications, and
unauthorized requests are blocked before they ever reach your
upstream services.
If a policy does not seem to take effect, verify that it is attached to the
correct application route. A defined but unattached policy is inert — it
exists in the configuration but does not affect any traffic. Also check
that the route path pattern matches the URLs you are testing. The
Orchestrator logs which policies are evaluated on each request when
debug logging is enabled.
Unexpected access denied
If a user is denied access when you expect them to be allowed, check the
user’s claims from the identity provider. The most common cause is a
mismatch between the role or attribute name in your policy and the actual
claim value from the IdP. For example, your policy may check for a role
called “admin” but the IdP sends “Admin” (case matters). Enable debug
logging to see the exact claims the Orchestrator receives and the policy
evaluation result.
Attribute not available for policy evaluation
If a policy references an attribute that the identity provider does not
include in its token or assertion, the policy evaluation fails because the
attribute is missing. Verify that your identity provider is configured to
include the needed claims (roles, groups, department, or custom attributes)
in the token it sends to the Orchestrator. Check the
Identity Fabric reference
for details on claim mapping for your specific provider.
Return to the Security guides hub for TLS, secrets, policies, and compliance
Authorization Reference
Per-mode authorization differences, enforcement behavior, and OPA policy patterns
Applications Reference
Complete configuration reference for authorization rules, operators, and policy syntax
Authentication Guides
Configure SSO, SAML federation, and identity provider connections that policies build on
Service Extensions
Custom authorization logic via isAuthorizedSE, handleUnauthorizedSE, and other SE hooks
Compliance and Audit
Log policy decisions and authorization events for compliance reporting
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Maverics Documentation","colors":{"primary":"#1DA1DC","light":"#2FCAFF","dark":"#0086C0"},"logo":{"light":"https://mintcdn.com/strataidentity/GnMIwAgmQ7Rnxm8R/logo/light.svg?fit=max\u0026auto=format\u0026n=GnMIwAgmQ7Rnxm8R\u0026q=85\u0026s=f75039b8474c2403c381ef74fdbee428","dark":"https://mintcdn.com/strataidentity/GnMIwAgmQ7Rnxm8R/logo/dark.svg?fit=max\u0026auto=format\u0026n=GnMIwAgmQ7Rnxm8R\u0026q=85\u0026s=c18e3db0543ce5426f86c06a48cfceba","href":"https://www.strata.io"},"favicon":"https://mintcdn.com/strataidentity/bx_Hbkhp9SuRuU18/favicon.svg?fit=max\u0026auto=format\u0026n=bx_Hbkhp9SuRuU18\u0026q=85\u0026s=7a515a8aae3869956b801d7d0a8a555c","appearance":{"default":"dark","strict":false},"navbar":{"links":[{"href":"https://strataidentity.my.site.com/support/s/","label":"Support"}],"primary":{"type":"button","label":"Console Login","href":"https://maverics.strata.io"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/strata-identity","github":"https://github.com/strata-io","x":"https://x.com/strataidentity","youtube":"https://www.youtube.com/@strataidentity"},"links":[{"header":"Resources","items":[{"label":"Legacy Docs","href":"https://legacy-docs.strata.io"}]},{"header":"Help","items":[{"label":"Status","href":"https://status.strata.io/"},{"label":"Support Center","href":"https://strataidentity.my.site.com/support/s"}]},{"header":"Terms and Policy","items":[{"label":"Privacy Policy","href":"https://www.strata.io/privacy-policy"},{"label":"Trust Center","href":"https://security-trust.strata.io/"},{"label":"Cookie Declaration","href":"https://www.strata.io/legal/cookiebot-declaration"}]}]},"integrations":{"cookies":{"key":"cookieconsent_analytics_allowed","value":"true"}},"errors":{"404":{"redirect":false,"title":"Page not found","description":"Looks like this page has moved or doesn't exist yet. Try searching the docs or head back to the [homepage](/introduction/overview). If you're looking for older content, it might still be on the [legacy documentation site](https://legacy-docs.strata.io)."}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"strataidentity","hasAudioNarration":false,"actualSubdomain":"strataidentity","customDomains":["docs.strata.io"],"gitSource":{"type":"github","owner":"strata-io","repo":"docs.strata.io","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeb48d5057e717ec7e9d46c","collectionId":"8209f079-89d2-42fc-811b-5a32f5fe6115","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeb48d5057e717ec7e9d46c"},"feedback":{"thumbs":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aeb48d5057e717ec7e9d46c","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"Reference","count":102},{"language":"default","tag":"Orchestration","count":90},{"language":"default","tag":"Guides","count":31},{"language":"default","tag":"Identity Fabric","count":31},{"language":"default","tag":"Configuration","count":18},{"language":"default","tag":"Console Administration","count":12},{"language":"default","tag":"Authentication","count":9},{"language":"default","tag":"Changelog","count":8},{"language":"default","tag":"Config Sources","count":8},{"language":"default","tag":"Secret Providers","count":8}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"footer{margin-top:2rem!important}"}],"page":{"pagePath":"guides/security/policies","slug":"/guides/security/policies","pageMetadata":{"title":"Configure Authorization Policies","sidebarTitle":"Authorization Policies","icon":"shield-check","description":null,"href":"/guides/security/policies"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,Check,CodeBlock,Frame,Heading,Info,OptimizedImage,Step,Steps,Tab,Table,Tabs,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Check)_missingMdxReference(`Check`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`By the end of this guide, you will have a Maverics Orchestrator enforcing authorization policies on every request — evaluating user attributes, roles, and context to determine whether access is allowed.`}),`\n`,_jsx(Heading,{level:`2`,id:`authentication-vs-authorization`,children:`Authentication vs. Authorization`}),`\n`,_jsxs(_components.p,{children:[`Before diving in, it helps to understand the distinction between these two concepts because they are often confused. `,_jsx(_components.strong,{children:`Authentication`}),` answers the question “Who is this user?” — it verifies identity through credentials like passwords, OIDC tokens, or SAML assertions. `,_jsx(_components.strong,{children:`Authorization`}),` answers the question “What is this user allowed to do?” — it checks whether an authenticated user has permission to access a specific resource or perform a specific action.`]}),`\n`,_jsxs(_components.p,{children:[`The Maverics Orchestrator handles both. Your `,_jsx(_components.a,{href:`/guides/authentication/overview`,children:`authentication configuration`}),` verifies user identity. The authorization policies in this guide control what those authenticated users can access. Authentication always happens first — you cannot authorize a user you have not identified.`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A running Maverics Orchestrator`}),` — If you have not installed it yet, follow the `,_jsx(_components.a,{href:`/guides/getting-started/quick-start`,children:`Quick Start guide`}),` first.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`An identity provider connected`}),` — Your Orchestrator should be authenticating users against an identity provider. The Quick Start or `,_jsx(_components.a,{href:`/guides/authentication/overview`,children:`SSO guides`}),` cover this.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Users authenticating successfully`}),` — Before adding authorization, confirm that users can log in and access your applications without policy restrictions.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`configure-policies`,children:`Configure Policies`}),`\n`,_jsx(Heading,{level:`3`,id:`choose-your-authorization-approach`,children:`Choose your authorization approach`}),`\n`,_jsx(_components.p,{children:`The Orchestrator provides different authorization mechanisms depending on the mode you are running. Choose the approach that matches your deployment:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`HTTP Proxy`}),` — Uses location-based policies with declarative `,_jsx(_components.code,{children:`and`}),`/`,_jsx(_components.code,{children:`or`}),` rules per URL path. Each policy binds to a route and evaluates user attributes against conditions you define. See `,_jsx(_components.a,{href:`#http-proxy`,children:`HTTP Proxy authorization`}),` below.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`OIDC Provider and SAML Provider`}),` — Uses app-level authorization with declarative rules. OIDC Provider also supports OPA token minting policies. Authorization is configured on the app itself rather than per-location. See `,_jsx(_components.a,{href:`#oidc-and-saml-provider`,children:`OIDC and SAML Provider authorization`}),` below.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`MCP Bridge and MCP Proxy`}),` (AI Identity Gateway) — Uses OPA-based inbound authorization exclusively. Policies written in Rego evaluate per-tool invocations with access to MCP-specific context. See `,_jsx(_components.a,{href:`#opa-authorization-ai-identity-gateway`,children:`OPA Authorization (AI Identity Gateway)`}),` below.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`LDAP Provider`}),` — Handles authorization entirely through Service Extensions. There are no declarative authorization rules. See the `,_jsx(_components.a,{href:`/reference/orchestrator/service-extensions`,children:`Service Extensions reference`}),` for the `,_jsx(_components.code,{children:`authenticateSE`}),` and `,_jsx(_components.code,{children:`searchSE`}),` hooks.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Not sure which mode applies? See `,_jsx(_components.a,{href:`/guides/authentication/choosing-a-mode`,children:`Choosing a Mode`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`http-proxy`,children:`HTTP Proxy`}),`\n`,_jsxs(_components.p,{children:[`In HTTP Proxy mode, authorization is configured per-location within the `,_jsx(_components.code,{children:`policies`}),` array on each app. Each policy specifies a URL path, the identity providers that handle authentication, and optionally the authorization rules that control access after authentication.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Define authentication policy binding`,children:[_jsx(_components.p,{children:`Before configuring authorization rules, you need a policy that binds your identity provider connectors to application routes.`}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Console UI`,id:`console-ui`,children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Console UI documentation is coming soon.`}),` This section will walk you\nthrough configuring this component using the Maverics Console’s visual\ninterface, including step-by-step screenshots and field descriptions.`]})}),_jsx(Frame,{caption:`Policy model overview in Maverics Console`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=ea8d2ec72a69d5a8c7955d78abba6a30`,alt:`Policy model overview screen in Maverics Console showing access control configuration options`,\"data-og-width\":`800`,width:`800`,\"data-og-height\":`400`,height:`400`,\"data-path\":`images/placeholder.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=280\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=8915bedc81639825bb64f4b29741511e 280w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=560\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=2391aa0bf01425e8995a1b8684607380 560w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=840\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=134f31ce48f4902f27e417082e7da90c 840w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=c17116c17f12c64573cc737986cbe837 1100w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=f1e0a37a82ab3dbb2b0ba6b0f9cc04ca 1650w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=190ef650fddf11454c2bc9b2482c05b6 2500w`})})]}),_jsxs(Tab,{title:`Configuration`,id:`configuration`,children:[_jsx(_components.p,{children:`Define policies on your app with authentication connector bindings:`}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`10`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`10`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`proxy`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` upstream`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://backend.example.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` routePatterns`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"app.example.com\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` policies`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`location`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authentication`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` idps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"azure\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ldap\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`]})})}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`policies[].location`})}),_jsx(_components.td,{children:`URL path this policy applies to (must be unique per app)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`policies[].authentication.idps`})}),_jsxs(_components.td,{children:[`Connector names for authentication — must match `,_jsx(_components.code,{children:`connectors[].name`}),` entries`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`policies[].authentication.allowUnauthenticated`})}),_jsxs(_components.td,{children:[`Allow unauthenticated access to this location (default: `,_jsx(_components.code,{children:`false`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`policies[].decision.lifetime`})}),_jsxs(_components.td,{children:[`Authorization decision cache TTL (duration string, e.g., `,_jsx(_components.code,{children:`\"5m\"`}),`)`]})]})]})]}),_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`idps`}),` array references connectors by name. The Orchestrator will redirect unauthenticated users to the first listed identity provider for login.`]})]})]})]}),_jsxs(Step,{title:`Define authorization rules`,children:[_jsxs(_components.p,{children:[`Authorization rules determine whether an authenticated user is allowed to access a resource. Rules support nested `,_jsx(_components.code,{children:`and`}),`/`,_jsx(_components.code,{children:`or`}),` conditions with four comparison operators: `,_jsx(_components.code,{children:`equals`}),`, `,_jsx(_components.code,{children:`notEquals`}),`, `,_jsx(_components.code,{children:`contains`}),`, and `,_jsx(_components.code,{children:`notContains`}),`.`]}),_jsx(_components.p,{children:`The Orchestrator supports multiple access control models, and you can combine them:`}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`RBAC (Role-Based Access Control)`}),` assigns permissions based on roles. A user has one or more roles (like “admin,” “editor,” or “viewer”), and each role grants access to specific resources. RBAC is straightforward and works well when your access patterns align with job functions.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`ABAC (Attribute-Based Access Control)`}),` makes decisions based on attributes — properties of the user, the resource, or the request context. Attributes can include things like department, location, or any claim from the identity provider.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`PBAC (Policy-Based Access Control)`}),` makes decisions based on centralized policies evaluated against request context, user attributes, and environmental conditions. PBAC generalizes RBAC and ABAC by expressing access rules as policies that can incorporate any combination of roles, attributes, and contextual factors.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`External PDP (Policy Decision Point)`}),` integration delegates authorization decisions to an external policy engine — such as OPA, Cedar, or a custom PDP — for organizations that maintain centralized policy engines across multiple systems.`]}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Console UI`,id:`console-ui-2`,children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Console UI documentation is coming soon.`}),` This section will walk you\nthrough configuring this component using the Maverics Console’s visual\ninterface, including step-by-step screenshots and field descriptions.`]})}),_jsx(Frame,{caption:`Policy definition in Maverics Console`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=ea8d2ec72a69d5a8c7955d78abba6a30`,alt:`Policy definition screen in Maverics Console showing role and attribute condition builders`,\"data-og-width\":`800`,width:`800`,\"data-og-height\":`400`,height:`400`,\"data-path\":`images/placeholder.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=280\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=8915bedc81639825bb64f4b29741511e 280w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=560\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=2391aa0bf01425e8995a1b8684607380 560w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=840\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=134f31ce48f4902f27e417082e7da90c 840w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=c17116c17f12c64573cc737986cbe837 1100w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=f1e0a37a82ab3dbb2b0ba6b0f9cc04ca 1650w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=190ef650fddf11454c2bc9b2482c05b6 2500w`})})]}),_jsxs(Tab,{title:`Configuration`,id:`configuration-2`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Allow all authenticated users`}),` (simplest authorization):`]}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`6`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`policies`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`location`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authentication`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` idps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"azure\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` allowAll`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`]})})}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Simple role-based rule:`})}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`8`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`policies`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`location`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/admin\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authentication`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` idps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"azure\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rules`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`and`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contains`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{{ azure.groups }}\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"admin-group\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`]})})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Nested and/or rules`}),` for complex access control:`]}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`13`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`policies`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`location`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authentication`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` idps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"azure\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ldap\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rules`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`and`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`equals`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{{ ldap.role }}\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"admin\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contains`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{{ ldap.memberOf }}\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"cn=managers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`or`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`equals`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{{ http.request.method }}\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GET\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`notContains`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{{ ldap.department }}\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"restricted\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rulesAggregationMethod`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"and\"`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`In this example: the first rule requires the user to be an admin AND a member of the managers group. The second rule allows GET requests OR users not in the restricted department. Both rules must pass (`,_jsx(_components.code,{children:`rulesAggregationMethod: \"and\"`}),`).`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Operators:`})}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Operator`}),_jsx(_components.th,{children:`Description`}),_jsx(_components.th,{children:`Operands`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`equals`})}),_jsx(_components.td,{children:`Exact string match`}),_jsx(_components.td,{children:`2 operands`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`notEquals`})}),_jsx(_components.td,{children:`Inverse exact match`}),_jsx(_components.td,{children:`2 operands`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`contains`})}),_jsx(_components.td,{children:`Substring or membership check`}),_jsx(_components.td,{children:`2 operands`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`notContains`})}),_jsx(_components.td,{children:`Inverse substring/membership`}),_jsx(_components.td,{children:`2 operands`})]})]})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Operand formats:`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`{{ connector.attribute }}`}),` — claim from a named connector (e.g., `,_jsx(_components.code,{children:`{{ azure.groups }}`}),`)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`{{ http.request.method }}`}),` — HTTP request method`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`\"literal\"`}),` — static comparison value`]}),`\n`]}),_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/reference/orchestrator/authorization`,children:`Authorization Reference`}),` for the complete rule syntax and per-mode comparison.`]})]})]}),_jsx(Tip,{children:_jsx(_components.p,{children:`Start with broad policies and refine as needed. A common pattern is to\nrequire authentication on all routes first, then add access control\nrestrictions to specific paths. You can always tighten access later\nwithout disrupting users who already have the right permissions.`})})]}),_jsxs(Step,{title:`Add programmatic authorization (optional)`,children:[_jsx(_components.p,{children:`For authorization logic that goes beyond declarative rules, HTTP Proxy mode supports two Service Extension hooks:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`isAuthorizedSE`})}),` runs after declarative rule evaluation and can override or supplement the result. This lets you implement dynamic authorization checks — for example, querying an external system, checking time-of-day restrictions, or applying business logic that cannot be expressed as `,_jsx(_components.code,{children:`and`}),`/`,_jsx(_components.code,{children:`or`}),` rules. Configure at `,_jsx(_components.code,{children:`policies[].authorization.isAuthorizedSE`}),`. See `,_jsx(_components.a,{href:`/reference/orchestrator/service-extensions`,children:`Service Extensions`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`handleUnauthorizedSE`})}),` customizes the response when authorization is denied. Instead of the default 403 Forbidden page, you can render a custom error page, redirect to a request-access workflow, or log additional context. Configure at `,_jsx(_components.code,{children:`apps[].handleUnauthorizedSE`}),`. This hook is mutually exclusive with the `,_jsx(_components.code,{children:`unauthorizedPage`}),` setting. See `,_jsx(_components.a,{href:`/reference/orchestrator/service-extensions`,children:`Service Extensions`}),`.`]}),`\n`]}),`\n`]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`oidc-and-saml-provider`,children:`OIDC and SAML Provider`}),`\n`,_jsxs(_components.p,{children:[`In OIDC Provider and SAML Provider modes, authorization is configured at the app level (`,_jsx(_components.code,{children:`apps[].authorization`}),`) rather than per-location. The same declarative rule syntax is available — `,_jsx(_components.code,{children:`allowAll`}),`, `,_jsx(_components.code,{children:`rules`}),`, and `,_jsx(_components.code,{children:`rulesAggregationMethod`}),` — but the configuration lives directly on the app instead of inside a `,_jsx(_components.code,{children:`policies[]`}),` block.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Configure declarative rules`,children:_jsxs(Tabs,{children:[_jsx(Tab,{title:`Console UI`,id:`console-ui-3`,children:_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Console UI documentation is coming soon.`}),` This section will walk you\nthrough configuring this component using the Maverics Console’s visual\ninterface, including step-by-step screenshots and field descriptions.`]})})}),_jsxs(Tab,{title:`Configuration`,id:`configuration-3`,children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Allow all authenticated users:`})}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`5`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-oidc-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oidc`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` allowAll`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`]})})}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Role-based rule at the app level:`})}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`8`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-oidc-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oidc`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rules`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`and`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`contains`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{{ azure.groups }}\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"app-users\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rulesAggregationMethod`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"and\"`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`The rule syntax (`,_jsx(_components.code,{children:`and`}),`, `,_jsx(_components.code,{children:`or`}),`, operators, operand formats) is the same as HTTP Proxy. The only difference is the config location: `,_jsx(_components.code,{children:`apps[].authorization`}),` instead of `,_jsx(_components.code,{children:`apps[].policies[].authorization`}),`.`]})]})]})}),_jsxs(Step,{title:`Configure OPA token minting policies (OIDC Provider only, optional)`,children:[_jsx(_components.p,{children:`OIDC Provider mode supports OPA policies for token minting authorization. This provides a governance layer over which tokens the Orchestrator issues — you can enforce policies on token exchange based on user attributes, client identity, or environmental conditions. This does not apply to SAML Provider mode, which issues assertions rather than tokens.`}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`17`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-oidc-app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oidc`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` authorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` tokenMinting`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` accessToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` policies`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`token-governance`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rego`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` package orchestrator`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` default result := {\"allowed\": true}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` # Deny tokens requested with the client_credentials grant type`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` result := {\"allowed\": false, \"internal_message\": \"client_credentials not permitted\"} {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` input.request.oauth.grant_type == \"client_credentials\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }`})}),`\n`]})})}),_jsxs(_components.p,{children:[`OPA token minting policies must define a `,_jsx(_components.code,{children:`result`}),` object containing an `,_jsx(_components.code,{children:`allowed`}),` field. The Orchestrator denies token issuance if `,_jsx(_components.code,{children:`allowed`}),` is `,_jsx(_components.code,{children:`false`}),`. You can optionally include `,_jsx(_components.code,{children:`internal_message`}),` (logged server-side) and `,_jsx(_components.code,{children:`external_message`}),` (returned to the client) fields. See `,_jsx(_components.a,{href:`#opa-policy-output-schema`,children:`OPA Policy Output Schema`}),` for the full output format.`]}),_jsx(Heading,{level:`4`,id:`oidc-app-input-schema`,children:`OIDC app input schema`}),_jsxs(_components.p,{children:[`The following JSON shows the complete data available under `,_jsx(_components.code,{children:`input`}),` when evaluating an OIDC token minting policy. Values are demonstrative.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`42`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`42`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"source\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ip\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"192.168.1.100\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"request\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"http\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"host\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"idp.example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/token\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"headers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Content-Type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"application/x-www-form-urlencoded\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"User-Agent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Go-http-client/1.1\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"oauth\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"client_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"325859cf-5bbe-492f-b9e7-929f2bed1230\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"read:users write:settings\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"grant_type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"urn:ietf:params:oauth:grant-type:token-exchange\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"subject_token\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"claims\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"api:read api:write\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"actor_token\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"claims\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"openid\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"response\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"access_token\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"claims\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"read:users write:settings\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"aud\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://api.example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"client_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"325859cf-5bbe-492f-b9e7-929f2bed1230\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"scope\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"read:users write:settings\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expires_in\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3600`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(Heading,{level:`4`,id:`oidc-app-example-enforce-scope-reduction-on-token-exchange`,children:`OIDC app example: enforce scope reduction on token exchange`}),_jsxs(_components.p,{children:[`The following policy ensures that scopes are only reduced during token exchange flows. The requested scopes in the token exchange request must be a subset of the scopes in the `,_jsx(_components.code,{children:`subject_token`}),`. All other grant types are allowed without restriction.`]}),_jsx(CodeBlock,{filename:`policy.rego`,numberOfLines:`29`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`29`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package orchestrator`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default result[\"allowed\"] := false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Allow all non-token-exchange grant types.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"allowed\"] if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.oauth.grant_type != \"urn:ietf:params:oauth:grant-type:token-exchange\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Parse scopes from space-separated strings into sets.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`requested_scopes := {s | some s in split(input.request.oauth.scope, \" \"); s != \"\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`subject_scopes := {s | some s in split(input.request.oauth.subject_token.claims.scope, \" \"); s != \"\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# For token exchange grants, allow if requested scopes are a subset of subject token scopes.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"allowed\"] if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.oauth.grant_type == \"urn:ietf:params:oauth:grant-type:token-exchange\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tprint(\"requested_scopes:\", requested_scopes)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tprint(\"subject_scopes:\", subject_scopes)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tcount(requested_scopes - subject_scopes) == 0`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"internal_message\"] := \"requested scopes exceed subject_token scopes\" if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tnot result.allowed`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"external_message\"] := \"invalid_scope\" if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tnot result.allowed`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})]}),_jsx(Step,{title:`Add programmatic authorization (optional)`,children:_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`isAuthorizedSE`}),` Service Extension hook is also available in OIDC Provider and SAML Provider modes. Configure at `,_jsx(_components.code,{children:`apps[].authorization.isAuthorizedSE`}),`. See `,_jsx(_components.a,{href:`/reference/orchestrator/service-extensions`,children:`Service Extensions`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`ai-identity-gateway-opa-authorization`,children:`AI Identity Gateway (OPA Authorization)`}),`\n`,_jsxs(_components.p,{children:[`In MCP Bridge and MCP Proxy modes (AI Identity Gateway), OPA is the only authorization mechanism. There are no declarative `,_jsx(_components.code,{children:`and`}),`/`,_jsx(_components.code,{children:`or`}),` rules. All authorization is handled through Rego policies that evaluate per-tool invocations with access to MCP-specific context such as tool name and arguments.`]}),`\n`,_jsxs(_components.p,{children:[`Configure OPA via `,_jsx(_components.code,{children:`authorization.inbound.opa`}),` with a policy `,_jsx(_components.code,{children:`name`}),` and either `,_jsx(_components.code,{children:`file`}),` (path to a `,_jsx(_components.code,{children:`.rego`}),` file) or inline `,_jsx(_components.code,{children:`rego`}),`.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Configure MCP app inbound authorization policies`,children:[_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Console UI`,id:`console-ui-4`,children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Console UI documentation is coming soon.`}),` This section will walk you\nthrough configuring this component using the Maverics Console’s visual\ninterface, including step-by-step screenshots and field descriptions.`]})}),_jsx(Frame,{caption:`OPA policy configuration in Maverics Console`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=ea8d2ec72a69d5a8c7955d78abba6a30`,alt:`OPA policy configuration screen in Maverics Console`,\"data-og-width\":`800`,width:`800`,\"data-og-height\":`400`,height:`400`,\"data-path\":`images/placeholder.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=280\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=8915bedc81639825bb64f4b29741511e 280w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=560\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=2391aa0bf01425e8995a1b8684607380 560w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=840\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=134f31ce48f4902f27e417082e7da90c 840w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=c17116c17f12c64573cc737986cbe837 1100w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=f1e0a37a82ab3dbb2b0ba6b0f9cc04ca 1650w, https://mintcdn.com/strataidentity/yo114yy_clZj7p9v/images/placeholder.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=yo114yy_clZj7p9v\u0026q=85\u0026s=190ef650fddf11454c2bc9b2482c05b6 2500w`})})]}),_jsxs(Tab,{title:`Configuration`,id:`configuration-4`,children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Inline OPA policy:`})}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`21`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`21`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`authorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` inbound`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`opa`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` opa`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-auth-policy`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rego`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` package orchestrator`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` default result := {\"allowed\": false}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` # Allow the listUsers tool`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` result := {\"allowed\": true} {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` input.request.mcp.type == \"tool\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` input.request.mcp.tool.params.name == \"listUsers\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` # Allow the getUser tool`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` result := {\"allowed\": true} {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` input.request.mcp.type == \"tool\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` input.request.mcp.tool.params.name == \"getUser\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }`})}),`\n`]})})}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`File-based OPA policy:`})}),_jsx(CodeBlock,{filename:`maverics.yaml`,numberOfLines:`6`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`authorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` inbound`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`opa`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` opa`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`my-auth-policy`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` file`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/etc/maverics/policies/auth.rego`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`For tool filtering configuration — controlling which tools are exposed to MCP clients during `,_jsx(_components.code,{children:`tools/list`}),` — see the `,_jsx(_components.a,{href:`/reference/orchestrator/applications/mcp-proxy#tool-filtering-opa`,children:`MCP Proxy App reference`}),`.`]})]})]}),_jsxs(_components.p,{children:[`For the complete per-mode authorization comparison, see the `,_jsx(_components.a,{href:`/reference/orchestrator/authorization#per-mode-authorization-differences`,children:`Authorization Reference`}),`.`]})]}),_jsxs(Step,{title:`OPA input schema and example policy`,children:[_jsxs(_components.p,{children:[`OPA policies must define a `,_jsx(_components.code,{children:`result`}),` object containing an `,_jsx(_components.code,{children:`allowed`}),` field. The Orchestrator denies the request if `,_jsx(_components.code,{children:`allowed`}),` is `,_jsx(_components.code,{children:`false`}),`. You can optionally include `,_jsx(_components.code,{children:`internal_message`}),` (logged server-side) and `,_jsx(_components.code,{children:`external_message`}),` (returned to the client) fields. See `,_jsx(_components.a,{href:`#opa-policy-output-schema`,children:`OPA Policy Output Schema`}),` for the full output format.`]}),_jsx(Heading,{level:`4`,id:`mcp-app-input-schema`,children:`MCP app input schema`}),_jsxs(_components.p,{children:[`The input schema varies by policy type. Connection policies receive only the HTTP request context; inbound and listing policies additionally receive `,_jsx(_components.code,{children:`input.request.mcp`}),` with the request type in `,_jsx(_components.code,{children:`mcp.type`}),`.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Connection admission`}),` — evaluated by the `,_jsx(_components.code,{children:`connection`}),` policy when the proxy establishes a new upstream session. No `,_jsx(_components.code,{children:`mcp`}),` context is present because no tool has been invoked yet:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`17`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"source\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ip\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"192.168.1.100\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"request\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"http\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"host\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"mcp.example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/mcp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"headers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Content-Type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"application/json\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"User-Agent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"MCP-Client/1.0\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Tool call`}),` (`,_jsx(_components.code,{children:`mcp.type: \"tool\"`}),`) — evaluated by the `,_jsx(_components.code,{children:`inbound`}),` policy on every tool invocation:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`29`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`29`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"source\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ip\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"192.168.1.100\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"request\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"http\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"host\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"mcp.example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/mcp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"headers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Content-Type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"application/json\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"User-Agent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"MCP-Client/1.0\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"mcp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tool\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"tool\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"params\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"listUsers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"arguments\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"exampleBodyKeyAlpha\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`10`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"exampleBodyKeyBeta\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Tool listing`}),` (`,_jsx(_components.code,{children:`mcp.type: \"tools_list\"`}),`) — evaluated by the `,_jsx(_components.code,{children:`listing`}),` policy once per tool during a `,_jsx(_components.code,{children:`tools/list`}),` request. The policy runs for each tool individually; tools the policy denies are removed before the response reaches the MCP client:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`25`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`25`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"source\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ip\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"192.168.1.100\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"request\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"http\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"host\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"mcp.example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"method\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"path\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/mcp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"headers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Content-Type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"application/json\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"User-Agent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"MCP-Client/1.0\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"mcp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tools_list\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"response\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"tools_list\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"listUsers\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(Heading,{level:`4`,id:`mcp-app-example-jwt-based-tool-authorization`,children:`MCP app example: JWT-based tool authorization`}),_jsxs(_components.p,{children:[`The following policy grants access to the `,_jsx(_components.code,{children:`get_ticket_price`}),` tool only if the `,_jsx(_components.code,{children:`Authorization`}),` header contains a JWT with the `,_jsx(_components.code,{children:`tickets:read`}),` scope. All other tools and requests are denied by default.`]}),_jsx(CodeBlock,{filename:`policy.rego`,numberOfLines:`32`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`32`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package orchestrator`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Default deny policy - all requests are denied unless explicitly allowed`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default result[\"allowed\"] := false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Decode the bearer token's claims. jwt.parse_bearer strips the \"Bearer \"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# prefix and returns the payload, or undefined if the header is absent or`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# does not carry a JWT -- in which case every rule below fails and the`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# default deny applies.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`jwt_payload := jwt.parse_bearer(input.request.http.headers.Authorization)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Allows access to the get_ticket_price tool if the token contains`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# the tickets:read scope. Logs the tool name, client ID, and subject`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# for audit purposes.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"allowed\"] if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tprint(\"request made to tool: \", input.request.mcp.tool.params.name)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.mcp.tool.params.name == \"get_ticket_price\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tprint(\"request made with client of: \", jwt_payload.client_id)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tcontains(jwt_payload.scope, \"tickets:read\")`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tprint(\"access granted to subject:\", jwt_payload.sub)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"internal_message\"] := \"access is only permitted to the 'get_ticket_price' tool with tickets:read scope\" if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tnot result.allowed`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"external_message\"] := \"unauthorized, contact support@example.com\" if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tnot result.allowed`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(Heading,{level:`4`,id:`connection-admission-example-check-permitted-mcp-servers-claim`,children:`Connection admission example: check permitted MCP servers claim`}),_jsxs(_components.p,{children:[`The following policy gates upstream session establishment to bearers whose JWT contains a custom `,_jsx(_components.code,{children:`permitted_mcp_servers`}),` claim that includes the target server name. An IdP stamps this claim with the list of MCP servers the agent is authorized to reach; the policy checks membership before the session is opened. Because the admission decision is sticky for the lifetime of the session, this check runs once at connect time rather than on every tool call.`]}),_jsx(CodeBlock,{filename:`connection.rego`,numberOfLines:`18`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`18`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package orchestrator`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default result[\"allowed\"] := false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`jwt_payload := jwt.parse_bearer(input.request.http.headers.Authorization)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"allowed\"] if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\t\"mission-control\" in jwt_payload.permitted_mcp_servers`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"internal_message\"] := \"bearer token does not permit access to this MCP server\" if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tnot result[\"allowed\"]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"external_message\"] := \"unauthorized: MCP server access not granted\" if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tnot result[\"allowed\"]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(Heading,{level:`4`,id:`tool-filtering-example-allowlist-tools-exposed-to-the-mcp-client`,children:`Tool Filtering example: allowlist tools exposed to the MCP client`}),_jsxs(_components.p,{children:[`The following policy exposes only the tools in the permitted set. The MCP client receives only these tools in its `,_jsx(_components.code,{children:`tools/list`}),` response — everything else is hidden, reducing the capabilities available to the AI agent.`]}),_jsx(CodeBlock,{filename:`listing.rego`,numberOfLines:`16`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`16`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package orchestrator`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default result[\"allowed\"] := false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Tools visible to downstream MCP clients`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`allowed_tools := {\"listUsers\", \"getUser\", \"searchUsers\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"allowed\"] if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.mcp.type == \"tools_list\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.mcp.response.tools_list.name in allowed_tools`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"internal_message\"] := \"tool is not in the allowed set\" if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tnot result[\"allowed\"]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(Heading,{level:`4`,id:`tool-filtering-example-scope-based-tool-exposure`,children:`Tool Filtering example: scope-based tool exposure`}),_jsxs(_components.p,{children:[`The following policy exposes a different set of tools depending on the agent’s JWT scopes. `,_jsx(_components.code,{children:`ticketService:write`}),` is a superset of `,_jsx(_components.code,{children:`ticketService:read`}),`: agents with only `,_jsx(_components.code,{children:`ticketService:read`}),` see read-only tools; agents with `,_jsx(_components.code,{children:`ticketService:write`}),` see both read and write tools. This narrows each agent’s attack surface to exactly what it needs.`]}),_jsx(CodeBlock,{filename:`listing.rego`,numberOfLines:`29`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`29`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package orchestrator`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default result[\"allowed\"] := false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`jwt_payload := jwt.parse_bearer(input.request.http.headers.Authorization)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Read-only tools available to agents with ticketService:read or ticketService:write`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`read_tools := {\"listTickets\", \"getTicket\", \"searchTickets\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# Write tools restricted to agents with the ticketService:write scope`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`write_tools := {\"createTicket\", \"updateTicket\", \"closeTicket\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"allowed\"] if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.mcp.type == \"tools_list\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.mcp.response.tools_list.name in read_tools`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tsome s in [\"ticketService:read\", \"ticketService:write\"]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tcontains(jwt_payload.scope, s)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"allowed\"] if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.mcp.type == \"tools_list\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tinput.request.mcp.response.tools_list.name in write_tools`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tcontains(jwt_payload.scope, \"ticketService:write\")`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"internal_message\"] := \"tool not permitted for this agent's scope\" if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tnot result[\"allowed\"]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`rego-built-in-functions`,children:`Rego Built-in Functions`}),`\n`,_jsxs(_components.p,{children:[`In addition to the standard `,_jsx(_components.a,{href:`https://www.openpolicyagent.org/docs/policy-reference#built-in-functions`,children:`OPA built-in functions`}),`, the Orchestrator registers its own built-ins. These are available in every OPA policy the Orchestrator evaluates — OIDC token minting, MCP connection, MCP inbound, and MCP tool filtering.`]}),`\n`,_jsx(Heading,{level:`4`,id:`jwt-parse_bearer`,children:_jsx(_components.code,{children:`jwt.parse_bearer`})}),`\n`,_jsxs(_components.p,{children:[`Decodes the claims from a bearer token in a single call, replacing the `,_jsx(_components.code,{children:`startswith`}),` / `,_jsx(_components.code,{children:`substring`}),` / `,_jsx(_components.code,{children:`io.jwt.decode`}),` sequence that policies would otherwise need to extract a JWT from an `,_jsx(_components.code,{children:`Authorization`}),` header.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`jwt.parse_bearer(header_value)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Parameter`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Description`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`header_value`})}),_jsx(_components.td,{children:`String`}),_jsxs(_components.td,{children:[`The full `,_jsx(_components.code,{children:`Authorization`}),` header value, including the `,_jsx(_components.code,{children:`Bearer `}),` scheme — typically `,_jsx(_components.code,{children:`input.request.http.headers.Authorization`}),`.`]})]})})]}),`\n`,_jsx(_components.p,{children:`Returns an object containing the token’s payload claims.`}),`\n`,_jsxs(_components.p,{children:[`The auth-scheme is matched case-insensitively, per `,_jsx(_components.a,{href:`https://datatracker.ietf.org/doc/html/rfc6750#section-2.1`,children:`RFC 6750 section 2.1`}),`, so `,_jsx(_components.code,{children:`Bearer`}),`, `,_jsx(_components.code,{children:`bearer`}),`, and `,_jsx(_components.code,{children:`BEARER`}),` are all accepted. The credentials that follow are decoded exactly as sent.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Usage:`})}),`\n`,_jsx(CodeBlock,{filename:`policy.rego`,numberOfLines:`10`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package orchestrator`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default result[\"allowed\"] := false`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`claims := jwt.parse_bearer(input.request.http.headers.Authorization)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`result[\"allowed\"] if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\tcontains(claims.scope, \"tickets:read\")`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Undefined results`})}),`\n`,_jsx(_components.p,{children:`The function returns undefined — rather than an error — when it cannot produce claims. This happens when:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.code,{children:`Authorization`}),` header is missing or empty.`]}),`\n`,_jsxs(_components.li,{children:[`The header does not use the `,_jsx(_components.code,{children:`Bearer`}),` auth-scheme (for example, `,_jsx(_components.code,{children:`Basic`}),`).`]}),`\n`,_jsx(_components.li,{children:`The value after the scheme is not a well-formed signed JWT.`}),`\n`,_jsx(_components.li,{children:`The JWT payload is not a JSON object.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Because an undefined value makes any rule referencing it fail, a policy with a `,_jsx(_components.code,{children:`default result[\"allowed\"] := false`}),` rule denies the request in all of these cases. This is the recommended pattern — write the default deny and let undefined claims fall through to it.`]}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`jwt.parse_bearer`}),` decodes the token payload `,_jsx(_components.strong,{children:`without verifying its signature`}),`, its expiry, or any other claim. It is a parsing helper, not a validation step — a policy that trusts its output alone will accept a forged token.`]}),_jsxs(_components.p,{children:[`Token trust is established elsewhere. Configure `,_jsx(_components.code,{children:`mcpProvider.authorization.oauth`}),` with `,_jsx(_components.code,{children:`servers[].tokenValidation`}),` so the Orchestrator validates the bearer token before the request reaches your policy. That OAuth block is optional — if it is absent, no token validation happens and a policy reading these claims is trusting unverified input. If you need to verify a signature inside the policy itself, use OPA’s `,_jsx(_components.code,{children:`io.jwt.decode_verify`}),` instead.`]})]}),`\n`,_jsx(Heading,{level:`3`,id:`opa-policy-output-schema`,children:`OPA Policy Output Schema`}),`\n`,_jsxs(_components.p,{children:[`All OPA policies — whether for OIDC token minting or MCP inbound authorization — must return a `,_jsx(_components.code,{children:`result`}),` object with the following structure:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"result\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"allowed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"internal_message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"user does not have necessary group membership: missing admin membership\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"external_message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"unauthorized\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`result.allowed`})}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[`Whether access should be granted (`,_jsx(_components.code,{children:`true`}),`) or denied (`,_jsx(_components.code,{children:`false`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`result.internal_message`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`Details about the decision for server-side logs only. Not returned to clients.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`result.external_message`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`Details returned to the client and also logged. Use for user-facing error messages.`})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Use `,_jsx(_components.code,{children:`print()`}),` statements in your Rego policies to emit debug output to Orchestrator logs. This is useful for tracing which rules matched and inspecting input values during policy development.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`test-policy-enforcement`,children:`Test policy enforcement`}),`\n`,_jsx(_components.p,{children:`With policies defined and applied, test that they work as expected by making requests as users with different roles and attributes. Testing both the “allowed” and “denied” paths confirms that your policies are enforced correctly.`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Start the Orchestrator`,children:[_jsx(_components.p,{children:`Start (or restart) the Orchestrator to load your policy configuration:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`maverics`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -config`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /etc/maverics/maverics.yaml`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Verify allowed access`,children:[_jsx(_components.p,{children:`Test with a user who should have access:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Log in`}),` as a user whose roles or attributes satisfy the policy conditions`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Navigate`}),` to the protected resource — you should see the application content`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Verify`}),` the request reached your upstream application (check application logs)`]}),`\n`]})]}),_jsxs(Step,{title:`Verify denied access`,children:[_jsx(_components.p,{children:`Test with a user who should be denied:`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Log in`}),` as a user who does not meet the policy conditions`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Navigate`}),` to the same resource — you should receive a 403 Forbidden response`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Verify`}),` the request did not reach your upstream application`]}),`\n`]}),_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Success!`}),` Your Orchestrator is enforcing authorization policies.\nRequests from authorized users proceed to your applications, and\nunauthorized requests are blocked before they ever reach your\nupstream services.`]})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Policy not being evaluated`,id:`policy-not-being-evaluated`,children:_jsx(_components.p,{children:`If a policy does not seem to take effect, verify that it is attached to the\ncorrect application route. A defined but unattached policy is inert — it\nexists in the configuration but does not affect any traffic. Also check\nthat the route path pattern matches the URLs you are testing. The\nOrchestrator logs which policies are evaluated on each request when\ndebug logging is enabled.`})}),_jsx(Accordion,{title:`Unexpected access denied`,id:`unexpected-access-denied`,children:_jsx(_components.p,{children:`If a user is denied access when you expect them to be allowed, check the\nuser’s claims from the identity provider. The most common cause is a\nmismatch between the role or attribute name in your policy and the actual\nclaim value from the IdP. For example, your policy may check for a role\ncalled “admin” but the IdP sends “Admin” (case matters). Enable debug\nlogging to see the exact claims the Orchestrator receives and the policy\nevaluation result.`})}),_jsx(Accordion,{title:`Attribute not available for policy evaluation`,id:`attribute-not-available-for-policy-evaluation`,children:_jsxs(_components.p,{children:[`If a policy references an attribute that the identity provider does not\ninclude in its token or assertion, the policy evaluation fails because the\nattribute is missing. Verify that your identity provider is configured to\ninclude the needed claims (roles, groups, department, or custom attributes)\nin the token it sends to the Orchestrator. Check the\n`,_jsx(_components.a,{href:`/reference/orchestrator/identity-fabric`,children:`Identity Fabric reference`}),`\nfor details on claim mapping for your specific provider.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`related-pages`,children:`Related Pages`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Security Overview`,icon:`shield-halved`,href:`/guides/security/overview`,children:_jsx(_components.p,{children:`Return to the Security guides hub for TLS, secrets, policies, and compliance`})}),_jsx(Card,{title:`Authorization Reference`,icon:`shield-check`,href:`/reference/orchestrator/authorization`,children:_jsx(_components.p,{children:`Per-mode authorization differences, enforcement behavior, and OPA policy patterns`})}),_jsx(Card,{title:`Applications Reference`,icon:`file-code`,href:`/reference/orchestrator/applications`,children:_jsx(_components.p,{children:`Complete configuration reference for authorization rules, operators, and policy syntax`})}),_jsx(Card,{title:`Authentication Guides`,icon:`key`,href:`/guides/authentication/overview`,children:_jsx(_components.p,{children:`Configure SSO, SAML federation, and identity provider connections that policies build on`})}),_jsx(Card,{title:`Service Extensions`,icon:`code`,href:`/reference/orchestrator/service-extensions`,children:_jsx(_components.p,{children:`Custom authorization logic via isAuthorizedSE, handleUnauthorizedSE, and other SE hooks`})}),_jsx(Card,{title:`Compliance and Audit`,icon:`clipboard-check`,href:`/guides/security/compliance`,children:_jsx(_components.p,{children:`Log policy decisions and authorization events for compliance reporting`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Configure Authorization Policies","sidebarTitle":"Authorization Policies","icon":"shield-check","description":null,"href":"/guides/security/policies"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Authentication vs. Authorization","slug":"authentication-vs-authorization","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Configure Policies","slug":"configure-policies","depth":2,"children":[{"title":"Choose your authorization approach","slug":"choose-your-authorization-approach","depth":3,"children":[]},{"title":"HTTP Proxy","slug":"http-proxy","depth":3,"children":[]},{"title":"OIDC and SAML Provider","slug":"oidc-and-saml-provider","depth":3,"children":[]},{"title":"OIDC app input schema","slug":"oidc-app-input-schema","depth":4,"children":[]},{"title":"OIDC app example: enforce scope reduction on token exchange","slug":"oidc-app-example-enforce-scope-reduction-on-token-exchange","depth":4,"children":[]},{"title":"AI Identity Gateway (OPA Authorization)","slug":"ai-identity-gateway-opa-authorization","depth":3,"children":[]},{"title":"MCP app input schema","slug":"mcp-app-input-schema","depth":4,"children":[]},{"title":"MCP app example: JWT-based tool authorization","slug":"mcp-app-example-jwt-based-tool-authorization","depth":4,"children":[]},{"title":"Connection admission example: check permitted MCP servers claim","slug":"connection-admission-example-check-permitted-mcp-servers-claim","depth":4,"children":[]},{"title":"Tool Filtering example: allowlist tools exposed to the MCP client","slug":"tool-filtering-example-allowlist-tools-exposed-to-the-mcp-client","depth":4,"children":[]},{"title":"Tool Filtering example: scope-based tool exposure","slug":"tool-filtering-example-scope-based-tool-exposure","depth":4,"children":[]},{"title":"Rego Built-in Functions","slug":"rego-built-in-functions","depth":3,"children":[]},{"title":"jwt.parse_bearer","slug":"jwt-parse_bearer","depth":4,"children":[]},{"title":"OPA Policy Output Schema","slug":"opa-policy-output-schema","depth":3,"children":[]},{"title":"Test policy enforcement","slug":"test-policy-enforcement","depth":3,"children":[]}]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Related Pages","slug":"related-pages","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/strataidentity/f5eb628399810ff7/status.js","/_mintlify/custom/strataidentity/b8e24dc33885ac0a/cookiebot.js"],"subdomain":"strataidentity","siteName":"Maverics Documentation","title":"Configure Authorization Policies - Maverics Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-30T20:34:57.108Z","originalFileLocation":"guides/security/policies.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Maverics Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Configure Authorization Policies - Maverics Documentation\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Maverics Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.strata.io/guides/security/policies\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://strataidentity.mintlify.site/_mintlify/api/og/v2?division=Security\u0026amp;title=Configure+Authorization+Policies\u0026amp;theme=fe1a0fe3316b752af9e31a17\u0026amp;signature=dcc86cd69eca704e78526de614fada8dfed5c6d0c0e488b726de3dc59ccc2982\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Configure Authorization Policies - Maverics Documentation\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://strataidentity.mintlify.site/_mintlify/api/og/v2?division=Security\u0026amp;title=Configure+Authorization+Policies\u0026amp;theme=fe1a0fe3316b752af9e31a17\u0026amp;signature=dcc86cd69eca704e78526de614fada8dfed5c6d0c0e488b726de3dc59ccc2982\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/strataidentity/qfgJMQlSCT_TH3a0/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Maverics Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1DA1DC\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.strata.io/guides/security/policies\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/security/policies.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.strata.io/#organization\",\"name\":\"Maverics Documentation\",\"url\":\"https://docs.strata.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/strataidentity/GnMIwAgmQ7Rnxm8R/logo/light.svg?fit=max\u0026auto=format\u0026n=GnMIwAgmQ7Rnxm8R\u0026q=85\u0026s=f75039b8474c2403c381ef74fdbee428\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.strata.io#website\",\"name\":\"Maverics Documentation\",\"url\":\"https://docs.strata.io\",\"publisher\":{\"@id\":\"https://docs.strata.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.strata.io/guides/security/policies#webpage\",\"url\":\"https://docs.strata.io/guides/security/policies\",\"name\":\"Configure Authorization Policies\",\"dateModified\":\"2026-09-30T20:34:57.108Z\",\"isPartOf\":{\"@id\":\"https://docs.strata.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.strata.io/guides/security/policies#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.strata.io/guides/security/policies#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Security\",\"item\":\"https://docs.strata.io/guides/security/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configure Authorization Policies\",\"item\":\"https://docs.strata.io/guides/security/policies\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.strata.io/guides/security/policies#article\",\"headline\":\"Configure Authorization Policies\",\"name\":\"Configure Authorization Policies\",\"url\":\"https://docs.strata.io/guides/security/policies\",\"mainEntityOfPage\":{\"@id\":\"https://docs.strata.io/guides/security/policies#webpage\"},\"dateModified\":\"2026-09-30T20:34:57.108Z\",\"publisher\":{\"@id\":\"https://docs.strata.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.strata.io#website\"}}]}\u003c/script>","siteName":"Maverics Documentation","nav":{"global":null,"tabs":[{"tab":"Introduction","pages":[{"title":"Introduction","href":"/introduction/overview"}]},{"tab":"Guides","groups":[{"group":"Getting Started","icon":"rocket","pages":[{"title":"Overview","icon":"compass","href":"/guides/getting-started/overview"},{"title":"Quick Start","icon":"bolt","href":"/guides/getting-started/quick-start"},{"title":"Protect Your First Application","icon":"shield-halved","href":"/guides/getting-started/first-application"}]},{"group":"Authentication","icon":"key","pages":[{"title":"Overview","icon":"compass","href":"/guides/authentication/overview"},{"title":"How Authentication Works","sidebarTitle":"How Auth Works","icon":"diagram-project","href":"/guides/authentication/how-auth-works"},{"title":"Choosing an Orchestrator Mode","sidebarTitle":"Choosing a Mode","icon":"compass-drafting","href":"/guides/authentication/choosing-a-mode"},{"title":"SSO with OIDC","icon":"key","href":"/guides/authentication/sso-with-oidc"},{"title":"Federate SAML Apps","sidebarTitle":"Federate SAML Apps","icon":"shield-halved","href":"/guides/authentication/saml-federation"},{"title":"Add SSO to Web Apps","sidebarTitle":"Add SSO to Web Apps","icon":"server","href":"/guides/authentication/http-proxy-auth"},{"title":"Modernize LDAP Authentication","sidebarTitle":"Modernize LDAP Auth","icon":"folder-tree","href":"/guides/authentication/ldap-provider"},{"title":"Single Logout (SLO)","sidebarTitle":"Single Logout","icon":"right-from-bracket","href":"/guides/authentication/single-logout"},{"title":"Migrate Between Identity Providers","sidebarTitle":"IdP Migration","icon":"right-left","href":"/guides/authentication/idp-migration"}]},{"group":"AI Identity","icon":"microchip-ai","pages":[{"title":"Overview","icon":"compass","href":"/guides/ai-identity/overview"},{"title":"Expose APIs to Agents","icon":"bridge","href":"/guides/ai-identity/mcp-bridge"},{"title":"Protect MCP Servers","icon":"shield-halved","href":"/guides/ai-identity/mcp-proxy"},{"title":"OWASP MCP Top 10","icon":"shield-check","href":"/guides/ai-identity/owasp-mcp-top-10"},{"group":"Connect an AI Client","icon":"plug","expanded":true,"pages":[{"title":"Connect Claude to the AI Identity Gateway","sidebarTitle":"Claude","icon":"message-bot","href":"/guides/ai-identity/connect/claude"},{"title":"Connect ChatGPT to the AI Identity Gateway","sidebarTitle":"ChatGPT","icon":"message-bot","href":"/guides/ai-identity/connect/chatgpt"}]},{"title":"Scale the AI Identity Gateway for Production","icon":"arrows-up-down","href":"/guides/ai-identity/scale-for-production"}]},{"group":"Identity Continuity","icon":"arrows-rotate","pages":[{"title":"Overview","icon":"compass","href":"/guides/identity-continuity/overview"},{"title":"Reducing Single Points of Failure","icon":"shield-check","href":"/guides/identity-continuity/reducing-spofs"}]},{"group":"Operations","icon":"wrench","pages":[{"title":"Overview","icon":"compass","href":"/guides/operations/overview"},{"title":"Deploy to Production","icon":"rocket","href":"/guides/operations/deploy"},{"title":"Monitor and Observe","icon":"chart-line","href":"/guides/operations/monitor"},{"title":"Scale for Production","icon":"arrows-up-down","href":"/guides/operations/scale"},{"title":"Troubleshoot Common Issues","icon":"wrench","href":"/guides/operations/troubleshoot"}]},{"group":"Security","icon":"shield-halved","pages":[{"title":"Overview","icon":"compass","href":"/guides/security/overview"},{"title":"Configure TLS","icon":"lock","href":"/guides/security/tls"},{"title":"Manage Secrets","icon":"vault","description":null,"href":"/guides/security/secrets-management"},{"title":"Configure Authorization Policies","sidebarTitle":"Authorization Policies","icon":"shield-check","href":"/guides/security/policies"},{"title":"Compliance and Audit","icon":"clipboard-check","description":null,"href":"/guides/security/compliance"}]}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/console/overview"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Configure Authorization Policies - Maverics Documentation","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-NdetNziF.js","DynamicMarkdown-CD8713Yy.js","zoom-image-lightbox-DMoL6lHz.js","lightbox-handle-r17bVUz3.js"]}