Skip to main content
Agent Identity

Flow · p2p

Peer-to-peer: AAuth identity-based access

No authorization server in the path. The agent signs the request; the resource decides from cryptographic identity. This is the 'p2p' that sits next to AAuth.

Use the hop list beside the stage, or the phase labels, to jump. Every hop has Now, Why, the RFC, and chips — none are skipped.

Actors

Agent · Agent provider · Resource

Sequence

Animated sequence · p2p

AAuth — How does an agent prove who it is when there is no authorization server?

Peer-to-peer: AAuth identity-based access

No authorization server in the path. The agent signs the request; the resource decides from cryptographic identity. This is the 'p2p' that sits next to AAuth.

Agentgets
Agent providersends
Resource

Now · 1/6· Discover· AAuth draftYou are here

Agent provider→Agent·Issues aa-agent+jwt bound to the agent's signing key

typ aa-agent+jwt: sub is the agent identifier, cnf binds the signing key. Optional ps is unused in this mode.

Why The provider attests the key. It is not an OAuth AS and mints no Bearer access token.

A wax-sealed ID card for the agent — not a photocopied pass.

  • typ: aa-agent+jwt from the spec
  • cnf from the spec
  • iss / dwk from the spec

Solid = from the spec

Step 1 of 6: agent-provider to agent. Issues aa-agent+jwt bound to the agent's signing key AAuth draft
Speed
ShareLinkedInX

The resource learns who the agent is, not necessarily which human it serves. For a person identifier without a grant, use draft-11 person identity. For a grant, use PS authorization. Individual draft — pin draft-11. Five modes, not draft-10's four.

Transcript

  1. 1

    DiscoverAgent provider→AgentAAuth draft

    Issues aa-agent+jwt bound to the agent's signing key

    typ aa-agent+jwt: sub is the agent identifier, cnf binds the signing key. Optional ps is unused in this mode.

    Why The provider attests the key. It is not an OAuth AS and mints no Bearer access token.

    A wax-sealed ID card for the agent — not a photocopied pass.

    • typ: aa-agent+jwt
    • cnf
    • iss / dwk
  2. 2

    DiscoverAgent provider→Agent providerAAuth draft

    Publishes JWKS at {iss}/.well-known/{dwk}

    The provider publishes aauth-agent.json (dwk) and JWKS. This is not an OAuth token endpoint.

    Why Do not skip this. A stranger cannot verify a first request unless the provider hosts keys at the well-known document named by dwk.

    Hang the signet on the wall where any door can look it up.

    • iss
    • dwk
    • JWKS
  3. 3

    ProveAgent→ResourceRFC 9421

    First signed HTTP request: Signature-Key (jwt) + Signature-Input + Signature

    The agent authenticates with HTTP Message Signatures. Signature-Key carries the JWT (scheme=jwt). This is the first request — the resource has never seen this agent.

    Why A stranger can verify the caller without an AS-issued Bearer token. Cover signature-key in the signature base. There is no authorization server on this hop.

    Wax seal on the envelope — the key, not a photocopied pass.

    • Signature-Key
    • Signature-Input
    • Signature
    • typ: aa-agent+jwt
  4. 4

    ProveResource→Agent providerAAuth draft

    Fetches JWKS via iss + dwk well-known document

    Resolve {iss}/.well-known/{dwk} and fetch JWKS.

    Why Do not skip JWKS fetch. The resource verifies the seal against the provider's published keys. That fetch is a trust-boundary crossing, not an OAuth token request.

    Check the wax against the published signet.

    • iss
    • dwk
    • JWKS
  5. 5

    ProveResource→ResourceRFC 9421

    Verifies RFC 9421 signature, typ, exp, and cnf.jwk

    The resource checks the signature base (including signature-key), typ aa-agent+jwt, exp, and that cnf matches the key that signed.

    Why Signature, JWT type, expiry, and key binding are separate checks. Missing signature → 401 AAuth-Requirement: agent-token.

    Feel the wax, read the card type, check the date, match the signet.

    • typ: aa-agent+jwt
    • cnf
    • exp
    • AAuth-Requirement
  6. 6

    CallResource→AgentAAuth draft

    Allows or denies based on local policy for that agent identifier

    The resource applies local policy to the agent identifier. access_mode=agent-token on resource metadata is advisory.

    Why Identity-based access answers which agent called — not which human it serves. No token exchange, no person server, no OAuth redirect.

    The door knows the seal. It does not yet know who sent the messenger.

    No token exchange, no person server, no OAuth redirect. 401 requirement=agent-token if the signature was missing.

    • access_mode=agent-token
    • local policy

Caveats

The resource learns who the agent is, not necessarily which human it serves. For a person identifier without a grant, use draft-11 person identity. For a grant, use PS authorization. Individual draft — pin draft-11. Five modes, not draft-10's four.

Why this hop looks this way

This is the AAuth meaning of p2p: agent and resource, no authorization server, no person server. It is as complete as AAuth two-party for the identity question and weaker for the user question.

It is not A2A (no Agent Card, no tasks). It is not did:peer (the identifier is published at a well-known URL so a stranger can verify a first request). It is not OAuth client-credentials (no client_id, no Bearer access token).

Wire: Signature-Key (scheme=jwt, aa-agent+jwt) + RFC 9421 Signature-Input/Signature. Cover signature-key in the signature base. Resource metadata access_mode=agent-token is advisory.

Do not confuse with

Deployment patterns

Specs in play