On-behalf-of
also called OBO · acting on behalf of a user · user-delegated agent authority
One field is doing two jobs here, and most implementations do the first while describing it as the second. Attribution is the easy half: record the principal on the trace, and a request has a person attached to it, which is what makes an agent’s activity reviewable by anyone other than its author. Authorisation is the half that changes what an agent can do, and it is only real when the named human’s own access actually bounds the call. The distinction is worth policing, because “our agents act on behalf of the user” is a sentence that is true of both and means something entirely different in each.
The design constraint that decides everything else is that the header is a string the caller chose. In most deployments there is no signed claim behind it — no verified subject, no acting-party claim, nothing the receiving side checked. Anything built on top of it therefore has to remain safe when the string is a lie, which is a far stronger requirement than making it work when the string is true. That rules out the intuitive design immediately: an agent must never gain authority by naming somebody, because then naming somebody is the attack.
The construction that satisfies the constraint is to treat the human as one more link in a delegation chain, evaluated by the same rule that every link must allow. Because the chain intersects, the human’s permissions can only subtract. This has a consequence worth stating because it is the footgun an operator reaches for on the first day: a person whose directory group maps to a role granting everything becomes a no-op rather than an escalation, since a wildcard satisfies its own link and cannot satisfy anyone else’s. Order matters too. The agent’s own decision should be taken before any field of the named human is read, so that a request the agent could never have made is refused for the agent’s reason — otherwise an intersection failure quietly overwrites the real cause of a refusal in the record.
The hard part is where the human’s permissions come from, and the honest answer involves a snapshot. The usual source is the group claims captured at that person’s last single sign-on, mapped to roles by an administrator. That is not a live directory read, and pretending otherwise is the single most common overstatement in this area: a group revoked this morning keeps granting until the person signs in again, or until the capture ages past a configured window and the request is refused rather than decided on stale evidence. Identity providers also disagree about whether the claim exists at all. Entra ID stops emitting group claims past roughly two hundred groups and sends a directory-API link instead; Okta requires the claim to be configured and its scope granted; Google Workspace emits no group claim on an ID token, so the intersection is simply unavailable there whatever else is configured. Each of those has to fail closed, and each should fail with a distinguishable reason, because the remedy differs — one person needs to sign in again, another needs an administrator to add a mapping, and an operator mid-rollout has to be able to tell those apart.
The weakness that survives all of this is omission rather than forgery. An agent that names nobody skips the mask entirely and is authorised on its own roles, so the control is opt-out by whoever is attacking it. Requiring a principal per agent closes that, at the cost of breaking every unattended batch job that agent runs, which is why it belongs on the agents where an unattributed call is genuinely the anomaly — a copilot, a ticket triager — rather than as an estate-wide default. And the rollout itself has to be stageable: Token Observe runs the intersection in three settings, where the default reads nothing at all, a shadow setting computes and records what it would have refused, and only the third refuses anything — which means an install that has not reached the third should not describe the intersection as a control it holds.
The request the agent could make and the person could not
A copilot agent holds a grant on the payroll-report tool because several of the people it serves need it. A request arrives naming an engineer who is not in the payroll group. The agent’s own permissions allow the call, so it is not refused for want of a grant; the engineer’s mapped roles are then appended as the final link, they do not allow that tool, and the request is refused — recorded as an authorisation denial naming the resource, with the person’s identifier and the age of the captured claims, but not the group names themselves. Reverse the case and nothing changes in the agent’s favour: a director whose directory group maps to a role granting every tool still cannot make the agent do anything the agent was not already permitted to do.
What on-behalf-of is routinely confused with
- Impersonation
- Impersonation makes the agent become the user: the request authenticates as that person and their full authority applies. On-behalf-of keeps both identities and intersects them, so the agent can never exceed either its own grants or the person’s. If a design can widen an agent’s authority by naming a more senior colleague, it is impersonation whatever it is called.
- The OAuth on-behalf-of flow
- The OAuth and RFC 8693 flows exchange one proven token for another, so the downstream service receives a cryptographically verified statement of subject and actor. A header-borne on-behalf-of value proves nothing and is only safe as a narrowing input. The names match; the trust models do not.
- Delegation chain
- A delegation chain lists agents; on-behalf-of names a person. They are evaluated by the same intersection rule and the human is usually appended as the final link, but they answer different questions — which agents routed this work, and whose authority it is supposed to sit inside.
Related terms
Delegation chain
A delegation chain is the ordered list of agent identities a request has passed through when one AI agent asks another to act for it. The rule that makes it a security control rather than a breadcrumb trail is that effective permissions are the intersection of every link and never the union: the request proceeds only if every agent in the chain would have been permitted to perform that exact action alone, so passing work along a chain can only narrow authority.
Agent identity
Agent identity is what establishes which AI agent is making a given call: a credential the agent presents, and a registered record that credential resolves to, carrying the agent’s owner, declared purpose, permissions and lifecycle status. It is a different thing from the identity of the human the agent is acting for and from the identity of the workload the agent runs inside, and treating any two of the three as interchangeable is the most common source of authorisation error in agent systems.
Action-level permissions
Action-level permissions authorise a specific operation on a specific named resource — one tool on one server, or one model — rather than granting access to a system as a whole. The unit is what matters: an agent granted a system inherits every operation that system exposes, including the ones next to the operation it actually needed.
Workload identity
Workload identity is an identity for a running process — a container, pod, virtual machine or function — established by attesting the environment it is running in rather than by a secret it stores, and normally exchanged at runtime for a short-lived credential. It answers what is running and where, which is a different question from which agent is calling and which person the call is for.
Where Token Observe does this
The definition above is the field's, not the product's. This is the part of the product that implements it, for a reader who wants to see one.
Agent permissions
Deny by default, explicit deny wins, and delegation intersects — so an agent cannot borrow authority it was never granted.
Off by default; only enforce refuses anything
Flight recorder
Every governed request in a timeline a compliance officer can read, and a search box that never writes SQL.
The filter cannot group, count or correlate across traces
The terms next to this one
What it means for an agent to be allowed to do something, and why the answer stops being obvious the moment one agent can ask another.
Definitions are the easy part.
The glossary is written to be useful whether or not you ever buy anything. If you have got to the point of deciding how to implement one of these in your own estate, say what your agents do and you will get a straight answer about what it would actually take.
no form · no qualification step · no sales desk · the other three ways in