Andrea Cosentino created CAMEL-25183:
----------------------------------------

             Summary: camel-openfga: support contextual tuples and condition 
context on the check operation
                 Key: CAMEL-25183
                 URL: https://issues.apache.org/jira/browse/CAMEL-25183
             Project: Camel
          Issue Type: Improvement
            Reporter: Andrea Cosentino


Follow-up to CAMEL-25028, which deliberately shipped {{camel-openfga}} without 
contextual tuples or condition
context on the {{check}} operation.

h2. Why it was left out

A contextual tuple is a relationship supplied for the duration of one Check and 
not persisted. It is the mechanism
OpenFGA offers for decisions that depend on facts the graph does not hold - "is 
the caller on the same network
segment", "is this within business hours".

It is also a self-authorization primitive. A contextual tuple derived from a 
message lets whoever controls that
message assert the very relationship being checked:

{code:json}
{"user": "user:attacker", "relation": "owner", "object": "document:secret"}
{code}

Supplied as a contextual tuple, that makes {{check(user:attacker, owner, 
document:secret)}} answer true. The same
applies to a condition {{context}} object, which feeds the CEL expressions a 
conditioned relation evaluates.

The first release therefore omitted both rather than shipping a gate that had 
not been reviewed. Everything else in
the component follows the same rule: the store, the authorization model, the 
relation and the operation come from the
endpoint, and only the object may come from the message.

h2. What is needed

Support for both, with a trust model that is explicit rather than implied:

* Contextual tuples and condition {{context}} configured on the endpoint, 
evaluated per exchange like
  {{user}}/{{object}}/{{relation}} already are - route-author-controlled, which 
is the trusted side of the boundary.
* If message-supplied contextual tuples are offered at all, they must be behind 
an option that is off by default,
  documented as trusting whoever can write the body, and most likely annotated
  {{security = "insecure:dev"}} in the same way {{failOpen}} is.
* Contextual tuples on {{batchCheck}} too, or an explicit statement that they 
are not supported there.
* Documentation stating plainly what a contextual tuple can do, because the 
danger is not obvious from OpenFGA's own
  docs, which present them purely as a feature.

h2. Notes

{{ClientCheckRequest}} already accepts 
{{contextualTuples(List<ClientTupleKey>)}} and {{context(Object)}}, and
{{ClientTupleKey}} carries a {{ClientRelationshipCondition}}, so the SDK side 
needs nothing new.

Worth reviewing alongside the {{writeTuples}} decision taken in CAMEL-25028: 
there the endpoint's configured
{{user}}/{{relation}}/{{object}} win over the message body precisely so that a 
route unmarshalling an untrusted
payload cannot choose which relationship is written. Contextual tuples on a 
check are the same question in a
different place.




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

Reply via email to