Federated Authorization Access (4-party)
The resource has its own access server. The agent obtains a person token from its PS, presents it at the resource's authorization endpoint, and gets back a resource token whose aud is the AS URL. The PS federates with the AS — sending the resource token and the agent token — and the AS evaluates resource policy and issues the auth token. Only the PS may call the AS token endpoint, which is why a resource token issued to an agent that cannot name a person is one nobody can redeem.
The agent signs with its agent token and names the resource it wants a person token for. resource is REQUIRED and becomes the token's aud.
The PS issues aa-person+jwt with a directed sub for that resource and cnf.jwk bound to the agent's signing key.
A person token carries no scope and no account — it identifies the person, it does not authorize anything.
The PS MAY require the person's approval first and return 202 with requirement=interaction.
Step 1: POST /person {resource} → 200 person_token
ps.example
application/json
sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:
sig=jwt;jwt="eyJhbGciOiJFZERTQSIsImtpZCI6ImFnZW50LWtleS0xIiwidHlwIjoiYWEtYWdlbnQ…
sig=("@method" "@authority" "@path" "content-type" "content-digest" "signature-k…
sig=:U2lnbmF0dXJlQnl0ZXNFeGFtcGxlVmFsdWVGb3JEZW1vbnN0cmF0aW9uUHVycG9zZXNPbmx5:
{
"resource": "https://api.example"
}Covered Components
Signature Base
Signature-Key Header
sig=jwt;jwt="eyJhbGciOiJFZERTQSIsImtpZCI6ImFnZW50LWtleS0xIiwidHlwIjoiYWEtYWdlbnQrand0In0…"
Signature-Input Header
sig=("@method" "@authority" "@path" "content-type" "content-digest" "signature-key");created=1700000000;alg="ed25519"
{"alg":"EdDSA","kid":"ps-key-1","typ"?:"aa-person+jwt"}{"iss"?:"https://ps.example","dwk"?:"aauth-person.json","aud"?:"https://api.example","sub"?:"8f14e45fceea167a5a36dedd4bea2543","cnf"?:{"jwk"?:},"jti"?:"pt-32d653","iat"?:1776222894,"exp"?:1776226494}