====== OpenFGA Check API ======
The **Check API** is the part that answers the core question:
**"Is this user allowed to do this thing?"** Your app sends a question, and
OpenFGA replies ''allowed: true'' or ''allowed: false''.
This is the piece your app calls the most. It uses the
[[security:authorization:openfga:authorization-model|authorization model]] (the rules)
and the [[security:authorization:openfga:relationship-tuples|relationship tuples]] (the data)
together to reach an answer.
===== Why it exists =====
Your app should not hold permission logic in its own code. Instead, before any
sensitive action, it asks OpenFGA. This keeps all rules in one place and gives a
fast, consistent yes/no everywhere.
===== What a Check asks =====
A Check question has the same three parts as a tuple, plus the store and model
it runs against.
^ Part ^ Meaning ^ Example ^
| **user** | who is asking | ''user:anne'' |
| **relation** | the action or link to test | ''viewer'' |
| **object** | the thing being accessed | ''document:budget'' |
In words: "Can Anne view the budget document?"
Check: user:anne viewer document:budget
===== What it returns =====
A simple boolean.
{ "allowed": true }
* **true**: a valid path was found. Access granted.
* **false**: no path was found. Access denied.
===== How a Check resolves =====
The model plus the tuples form a graph. A Check //walks// that graph.
- Your app asks the question.
- OpenFGA reads the model to learn what path would allow it.
- OpenFGA walks the tuples, following direct grants and computed relations.
- If the links connect, it returns ''true''. If not, ''false''.
Example: Anne is not a direct viewer, but she is an ''editor'', and the model says
''viewer'' includes ''editor''. The walk connects, so the answer is ''true''.
===== Contextual tuples =====
A Check can include **contextual tuples**: extra facts passed in for this one
question only. They are never stored. Use them for data you know at request time,
such as the user's current department.
===== Conditions (ABAC) =====
If the model uses conditions, the Check can pass **context** values (like time or
amount). OpenFGA evaluates the condition as part of the walk. The grant only
counts if the condition is true.
===== Consistency options =====
OpenFGA caches data for speed. A Check can ask for different consistency levels:
* **Higher consistency**: always read the newest data. Safer, a little slower.
* **Lower consistency**: allow cached data. Faster, may be slightly stale.
Right after you write a tuple, use a higher-consistency Check if the new grant
must take effect immediately.
===== Related queries =====
The Check API answers one yes/no question. OpenFGA has sibling queries for other
needs:
* **BatchCheck**: many Check questions in one call.
* **Expand**: show //why// access is granted (the full path).
* **ListObjects**: "Which documents can this user read?"
* **ListUsers**: "Who can access this document?"
===== How it fits =====
Input → Process → Output:
* **Input**: your app sends ''(user, relation, object)'' with the store and model.
* **Process**: OpenFGA walks the graph of rules and tuples.
* **Output**: ''allowed: true'' or ''allowed: false''; your app allows or blocks the action.
===== See also =====
* [[security:authorization:openfga:store|Store]]
* [[security:authorization:openfga:authorization-model|Authorization model]]
* [[security:authorization:openfga:relationship-tuples|Relationship tuples]]
* [[https://openfga.dev/docs/interacting/relationship-queries|Relationship queries (Check, Expand, ListObjects)]]