[ 
https://issues.apache.org/jira/browse/CAMEL-24643?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andrea Cosentino resolved CAMEL-24643.
--------------------------------------
    Resolution: Fixed

> camel-opa - allow exchange properties in the OPA input document
> ---------------------------------------------------------------
>
>                 Key: CAMEL-24643
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24643
>             Project: Camel
>          Issue Type: Improvement
>            Reporter: Andrea Cosentino
>            Assignee: Andrea Cosentino
>            Priority: Major
>             Fix For: 4.23.0
>
>
> h2. Problem
> {{camel-opa}} (CAMEL-24634) builds its OPA {{input}} document from message 
> headers only:
> {code:java}
> for (Map.Entry<String, Object> entry : 
> exchange.getMessage().getHeaders().entrySet()) {
> {code}
> (OpaPolicyEvaluator#buildInput)
> That leaves out the place where Camel's authentication components actually 
> put verified identity. {{KeycloakSecurityProcessor}} reads and stores the 
> authenticated principal in *exchange properties*:
> * {{KeycloakSecurityConstants.ACCESS_TOKEN_PROPERTY}}
> * {{KeycloakSecurityConstants.TOKEN_SUBJECT_PROPERTY}}
> * {{KeycloakSecurityConstants.TOKEN_THUMBPRINT_PROPERTY}}
> and it deliberately prefers properties over headers - 
> {{preferPropertyOverHeader}} defaults to {{true}}, documented as preventing 
> "header-based token override attacks", with {{allowTokenFromHeader}} offered 
> as a way to switch the header channel off entirely.
> h2. Why this matters
> The premise of CAMEL-24634 was that {{camel-spiffe}} / {{camel-keycloak}} 
> establish *who the caller is* and {{camel-opa}} decides *whether they are 
> allowed*. Today those two halves cannot be composed directly: a route that 
> authenticates with {{KeycloakSecurityPolicy}} and then authorizes with 
> {{camel-opa}} has to copy the verified subject from an exchange property into 
> a message header so the policy can see it.
> That is the wrong direction. It moves trusted identity into the exact channel 
> {{camel-keycloak}} treats as untrusted, and it makes the safe composition the 
> awkward one.
> h2. Proposal
> Add an {{includeProperties}} option, mirroring the existing 
> {{includeHeaders}}: a comma-separated allow-list of exchange property names, 
> contributing a {{properties}} object to the input document alongside 
> {{headers}}.
> {code:java}
> {
>   "headers":    { ... },
>   "properties": { "CamelKeycloakTokenSubject": "alice" },
>   "body":       ...,
>   "exchangeId": "...",
>   "routeId":    "..."
> }
> {code}
> Notes:
> * Default to *empty* rather than {{*}}. Unlike headers, exchange properties 
> are mostly Camel-internal bookkeeping, and dumping all of them would be noise 
> at best. This also keeps the change fully backwards compatible.
> * Reuse the existing name-matching and JSON-safety conversion from 
> {{buildInput}}, including the shallow-conversion contract.
> * The same rule as for headers applies: the component's own decision 
> headers/properties must never be fed back in.
> * Document the {{keycloak -> opa}} and {{spiffe -> opa}} compositions in 
> {{opa-component.adoc}}, since making that pairing natural is the point of the 
> change.
> h2. Scope
> {{main}} only. Additive option, no behaviour change for existing routes.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to