Skip to content

BuildNot yet confirmed elsewhere1 publisher3 min readPublished

Two tokens, one exchange: binding a user's consent to an attested agent workload

A PingFederate write-up wires RFC 8693 token exchange to a SPIRE JWT-SVID so neither the user's token nor the workload's proof can stand in for the other. The lifetimes tell you where the risk sits.

The Engineer · Build desk

How we use AISend a correction

Illustration accompanying Two tokens, one exchange: binding a user's consent to an attested agent workload
Generated illustration

What happened

  • A Tokenetes-style design puts PingFederate in the Transaction Token Service role, minting Txn-Tokens through RFC 8693 token exchange.
  • The subject token says who authorized the call and the actor token says which attested workload is asking; neither is accepted in place of the other.
  • The agent cannot name its own logical identity; trusted policy configuration maps the verified SPIFFE ID to a configured AgentID.

Why it matters

  • constraint A stolen user access token buys nothing on its own here. The thief also has to be executing inside a workload SPIRE will vouch for at the moment of the exchange.
  • decision A sixty-second SVID forces a choice about runtime topology: the SPIRE agent becomes a live dependency of every tool call, with its availability now part of your transaction success rate.
  • exposure The SPIFFE-ID-to-AgentID mapping becomes the thing worth attacking, because editing one row grants a workload the authority of a different logical agent.
  • capability Gateways and downstream services can now authorize a call without ever holding the user's credential, which removes them from the blast radius of a leaked access token.

Two clocks mark out the trust model. In the illustrative payloads, the user's access token runs from `iat` 1770000000 to `exp` 1770000300 [12], five minutes of validity [13]. The workload's JWT-SVID from SPIRE runs to 1770000060 [15], sixty seconds [14], one fifth as long [16]. The human's authorization is allowed to be stale; the proof that an attested process is making the call is not. In practice that means the agent has to reach its SPIRE agent close to the moment it posts to the token endpoint, which puts workload attestation on the request path rather than in startup configuration.

The refusal is the interesting part. The caller never supplies an authoritative logical agent identity: `spiffe://example.org/agent/demo` is mapped to a configured logical agent such as `urn:agent:demo` inside the trusted policy boundary [18], and the actor token itself does not let the workload choose an AgentID [17]. So the question "which agent is this" is answered by a table in PingFederate, not by anything the agent says about itself. Whoever can edit that mapping can promote a workload into a different logical agent without touching a line of agent code.

Validation is described as two independent processors, one for the user token and one for the SVID, checking signature, issuer, audience, time, key ID and algorithm before the SPIFFE ID is mapped and a short-lived transaction JWT is issued [6]. The write-up is explicit that claims are only consumed after the whole token passes those checks, and that raw tokens are never written to application or audit logs [2], with tokens confined to the request body over validated TLS rather than URLs, log lines, audit events or error responses [5]. That last constraint is the one operators break first, because a redacted token is much harder to debug than a logged one.

Downstream, the user's access token stops at the exchange. It is not forwarded to the MCP gateway or to any downstream service [3]. What travels instead is a Txn-Token signed with ES256 and typed `txntoken+jwt` [19], carrying the requesting workload in `req_wl` and a transaction context naming the target, the tool `customer.read`, the logical agent and an instance ID [20]. The gateway's authorization decision now keys on fields that used to be telemetry. The response comes back in the ordinary OAuth token response shape [21], so nothing in the client transport has to change.

Read the source for what it is: a design, not a deployment record. The payloads are labelled illustrative decoded claims [2], the Txn-Token body carries `iat` 0 and `exp` 0 [20], and the text says PingFederate *should* issue the token after validating subject and actor separately [7]. The architectural point stands on its own, since the base Transaction Tokens profile leans on authenticated TTS clients and this design adds explicit actor evidence on top [11]. But nobody has shown you a policy that runs.

What to watch

  • Whether a later part publishes a running policy issuing tokens with real iat and exp values instead of illustrative payloads.
  • Whether the MCP gateway side documents how it verifies req_wl and tctx, since a transaction token nobody checks is decoration.
  • How the SPIFFE-ID-to-AgentID mapping is change-controlled: who can add an entry, and whether that change is itself audited.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence44
Adoption10
Hype gap−5
Incentives42
Confidence55
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    The agent sends subject_token = the user's access token, actor_token = the agent workload's JWT-SVID, requested_token_type = urn:ietf:params:oauth:token-type:txn_token, audience = the transaction trust domain, and scope = the narrow purpose of the transaction.

  2. [2]

    The payloads shown are illustrative decoded claims; in the implementation claims are used only after the complete token has passed signature, issuer, audience, algorithm, key ID and time validation, and raw tokens are never written to application or audit logs.

  3. [3]

    The subject token represents the authenticated user, does not prove which agent workload is presenting it, and is not forwarded to the MCP gateway or downstream services.

Sources

1 independent publisher whose own reporting we read for this story.

  1. dev.to

    1 article · August 23, 2026

    Trusted AI Agent Transactions, Part 2: PingFederate Token Exchange

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Topics

Loading related stories