There is a point in every product where roles stop being enough. Not "can this person edit documents", but "can this person edit this document". The category name for that is fine-grained authorization, or relationship-based access control, and there is a healthy market of engines that do it well: OpenFGA, AuthZed, Permit.io, Oso and others.
The problem is never the engine. The problem is that the engine does not know who your users are. So you run it as a second deployment, and then you write the thing nobody scoped: a synchronisation job that copies your directory into it, keeps up with joiners and leavers, and reconciles when it drifts. That job is now a dependency of every access check in your product.
What SkipAuth does
Resource Authorization exposes the same functional-role engine that governs SkipAuth itself to your applications, over machine-to-machine APIs. Your application stores its own membership data and asks its own questions:
GET /api/v1/resource-authorization/roles
POST /api/v1/resource-authorization/members
GET /api/v1/resource-authorization/scopes
POST /api/v1/resource-authorization/check
GET /api/v1/resource-authorization/identities/{id}/scopes
Each application gets a namespace of its own, rooted under its own client identifier, provisioned the first time it is used. An application can create, read and delete inside its own root and cannot reach outside it, which means one application cannot read another one's access model even though both are served by the same engine.
Because the engine is the same one that mints your tokens, there is no directory to synchronise. The identity your application is asking about is the identity SkipAuth already holds, with the roles it already resolves and the scopes already expanded.
How to check it
The test that separates this from a bolted-together arrangement:
- Create a person in the directory and give them a functional role.
- From your application, using its own credentials, add that person to one of your own resource roles.
- Ask
checka question that depends on both facts at once. - Now remove the person from the directory role and ask again.
If the answer changes without a synchronisation step, an event, or a wait, the two models are one model. That is the whole claim.
Then try to read another application's namespace with your application's credentials. It should be refused.
Where it stops
Resolver performance is not the claim. The standalone engines in this category have spent years on check latency at very large scale, with caching strategies from the research the whole category is built on. SkipAuth does not claim to beat them at that. It claims that a team buying fine-grained authorization already has an identity problem, and that solving both in one place is worth more than the last few milliseconds for most products. If your requirement is a hard single-digit millisecond check budget across billions of relationships, buy the specialist.
Your application owns its model. SkipAuth stores, serves and resolves it, but the shape of it is yours to design. There is no template for what a project, workspace or document hierarchy should look like.
What the alternatives ask of you
| Approach | What it asks of you | SkipAuth |
|---|---|---|
| A standalone fine-grained authorization engine | A second cluster to operate, plus a directory synchronisation job that becomes critical infrastructure. | The engine already holds your identities, so there is nothing to synchronise. |
| Access tables inside each application | Build the model, the resolver and the audit once per application, and answer questions per team. | One engine, one place to ask, and per-application namespaces so teams stay independent. |
| A policy engine with your data pushed in | Ship data to the policy layer and keep it fresh, or accept stale answers. | The answer is computed against live identity state at the moment you ask. |
| Only roles, and hope | Grant more broadly than you meant to, and discover it in an incident. | The slice is expressible, so it can be granted narrowly. |
Read next: application trust you can read in one line.