may_act (Authorized Actor) Claim in a JWT
may_act names the party permitted to act on behalf of the subject of the token. It is a statement of permission, checked before a delegation token is issued, not a record that delegation happened.
At a glance
- Claim
- may_act (Authorized Actor)
- Defined in
- RFC 8693 section 4.4
- Value type
- JSON object identifying the permitted actor, typically by sub
- Required
- Optional. Present on a token that is meant to be exchanged for a delegation token.
- Sample value
- { "sub": "support-agent-42" }
- In the decoder
- Shown under Custom claims as decoded JSON alongside act, if both are present.
In detail
may_act and act are the two halves of one mechanism and they sit on different tokens. may_act travels on the subject's own token and says who is allowed to act for that subject. act appears on the token produced afterwards and says who actually is. Confusing the two produces an authorization server that records delegation without ever deciding whether it was permitted.
The check happens at the exchange. A client presents the subject token and asks for a delegation token naming an actor. The authorization server compares the requested actor against may_act on the subject token, and refuses the exchange when they do not match. Because the constraint rides inside a signed token, it survives being passed between services without needing a shared policy lookup.
That makes it useful for narrowly scoped support access. A ticket handling system can hand a support agent a token whose may_act names that specific agent, so nobody else can exchange it, and the permission expires with the token rather than lingering in a role assignment somebody forgets to remove. The narrower the value, the smaller the window.
The decoder shows may_act under Custom claims as JSON. It cannot evaluate it, since deciding whether an exchange is permitted is the authorization server's job and needs both tokens plus policy. What the tool is good for is confirming which actor a subject token actually authorizes, which is usually the question when an exchange is being refused and the request looks correct.
Examples
{
"iss": "https://auth.example.com",
"sub": "8f14e45fceea167a5a36dedd4bea2543",
"may_act": { "sub": "support-agent-42" }
}{
"iss": "https://auth.example.com",
"sub": "8f14e45fceea167a5a36dedd4bea2543",
"act": { "sub": "support-agent-42" }
}The requested actor matched may_act, so the exchange succeeded and act records it.
Things that catch people out
- Issuing subject tokens with a broad may_act value such as a whole group. Anyone in that group can then exchange the token for a delegation token.
- Expecting may_act on the delegation token. It belongs on the subject token being exchanged; the result carries act instead.
- Relying on may_act alone. It says who may act, not what they may do, so scope still has to be narrowed at the exchange.
Try it: JWT Decoder
Paste a token to decode the header and payload, read the claims and expiry, and verify the signature in your browser. Nothing is uploaded.
JWT Decoder
LOCAL · Browser-OnlyDecode and inspect JSON Web Tokens without sending them to a server
Related JWT claims and algorithms
All jwt claims and algorithms →act (Actor) Claim in a JWT
The act claim names the party acting on behalf of the subject. How nesting records a delegation chain, and why the decoder shows it as raw JSON.
sub (Subject) Claim in a JWT
The sub claim says who the token is about. Why it is only unique within one issuer, what pairwise subjects change, and how the decoder shows it.
cnf (Confirmation) Claim in a JWT
The cnf claim binds a token to a key its holder must prove. How mTLS and DPoP use it, why it stops replay of a stolen token, and decoder limits.
email Claim in an OpenID Connect ID Token
The email claim carries the end user's email address. Why it must not be used as an account key, what scope returns it, and what the decoder shows.
email_verified Claim in an OpenID Connect ID Token
The email_verified claim says whether the provider verified the address. Why account linking depends on it, the string true trap, and decoder behaviour.
preferred_username Claim in an ID Token
The preferred_username claim carries a shorthand name for the user. Why OpenID Connect says it is neither unique nor stable, and how the decoder shows it.
Tools for this
- JWT Decoder Free online JWT decoder - decode and inspect JSON Web Tokens without sending them to a server