Skip to content

feat(kagent): OBO actor-token forwarding to muster via X-Actor-Token#190

Merged
QuentinBisson merged 4 commits into
mainfrom
feat/sre-agent-obo-forward-authorization
Jun 25, 2026
Merged

feat(kagent): OBO actor-token forwarding to muster via X-Actor-Token#190
QuentinBisson merged 4 commits into
mainfrom
feat/sre-agent-obo-forward-authorization

Conversation

@QuentinBisson

Copy link
Copy Markdown
Contributor

What

Adds obo block to agent definitions (defaulting to enabled: true) and wires the agent SA token as X-Actor-Token in the muster RemoteMCPServer headersFrom.

When the kagent runtime forwards the caller's Dex token as Authorization (via KAGENT_PROPAGATE_TOKEN_OVERRIDES_STATIC, kagent-dev/kagent#2087), muster receives both tokens per-request and localMint does one RFC 8693 exchange: sub=user, act=sre-agent-SA. No STS plugin intermediate hop.

For autonomous M2M runs (no user token), mcp-oauth strips the actor when actor==subject (PR giantswarm/mcp-oauth#488), so the minted token carries no act claim and no SA→SA delegation rule is needed.

Dependencies

  • giantswarm/mcp-oauth#488 — self-actor strip (actor==subject → pure M2M)
  • kagent-dev/kagent#2087KAGENT_PROPAGATE_TOKEN_OVERRIDES_STATIC so forwarded user token beats static SA

Set allowedHeaders: ["authorization"] on the sre-agent muster tool ref so the
inbound user token is forwarded onto muster tool calls. The kagent controller's
STS plugin then exchanges it (sub=human, act=sre-agent SA) and muster mints the
backend token on behalf of the human instead of as the agent SA.

headersFrom (the static SA token) is kept as the M2M fallback: autonomous runs
carry no inbound user token, so nothing is forwarded and muster sees the SA.
…int model

The previous comment claimed forwarding authorization performs OBO via an STS
plugin exchange. It does not: muster localMint runs the RFC 8693 exchange,
taking the forwarded Dex token as subject and the agent SA token (X-Actor-Token)
as actor. Document that, the kagent override env var it depends on
(KAGENT_PROPAGATE_TOKEN_OVERRIDES_STATIC, kagent-dev/kagent#2044), the required
muster ActorDelegationPolicy, and the M2M fallback when no caller token exists.
When `obo.enabled: true` (default), the agent's own SA OIDC token is sent
as X-Actor-Token alongside the forwarded user Authorization header. muster
then mints a localMint token with sub=user, act=SA — one exchange, no STS
plugin hop required.

When no user token is present (autonomous M2M runs), mcp-oauth strips the
actor token because actor==subject, so the minted token carries no act claim.
No SA→SA delegation rule is needed.

Depends on mcp-oauth fix/strip-self-actor-token (PR #488).
@QuentinBisson QuentinBisson marked this pull request as ready for review June 25, 2026 14:47
@QuentinBisson QuentinBisson requested a review from a team as a code owner June 25, 2026 14:47
@QuentinBisson QuentinBisson merged commit 390b1a5 into main Jun 25, 2026
8 checks passed
@QuentinBisson QuentinBisson deleted the feat/sre-agent-obo-forward-authorization branch June 25, 2026 14:47
teemow added a commit that referenced this pull request Jun 25, 2026
…-umbrella-route

* origin/main:
  feat(kagent): OBO actor-token forwarding to muster via X-Actor-Token (#190)
  chore: align files according to platform standards (#189)
  chore: align files according to platform standards (#188)
  feat(kagent): forward the human token from sre-agent to muster for OBO (#187)
  fix(kagent): name sre-agent muster meta-tools so the UI stops showing "Unknown Tool" (#186)
  chore(deps): update gsoci.azurecr.io/giantswarm/agentgateway docker tag to v1.3.1 (#179)
  fix(kagent): refresh Dex id_token in oauth2-proxy for OBO (#184)

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	CHANGELOG.md
#	helm/agentic-platform/values.yaml
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant