Repository navigation
feat(a2a): migrate agent auth from XSUAA client-credentials to SAP IAS (#2593) - #2643
Merged
Merged
Conversation
jung-thomas
marked this pull request as ready for review
October 4, 2026 17:15
This was referenced Oct 4, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #2593.
Migrates the A2A agent (
POST /a2a) authentication from the legacy XSUAA client-credentials flow to SAP IAS client-credentials (machine-to-machine), tenantatxgsg7zi. Mirrors the MCP signed-in tier migration (PR #2592). A2A is M2M (no browser), so this is a like-for-like swap of the token source (XSUAA → IAS) keeping the client-credentials grant — no PKCE/auth-code applies.Non-breaking & reversible
CAP auth on the main srv is
{ kind: 'ias', xsuaa: true }(hybrid) under the[hybrid]/[production]profiles only — existing XSUAA tokens keep working through the transition. Unit tests stay onmockedauth (no base kind override). Rollback = revert the approuter route + card scheme; the hybrid kind can stay.Changes
securitySchemes.ias(OAuth2clientCredentials, scopeopenid);security: [{ ias: ['openid'] }]. XSUAA scheme removed.<issuer>/oauth2/token), withChatSettings.a2aTokenUrlas an optional DB override.tutorials-identity(existing-service IAS client) bound totutorials-srvin both MTA descriptors;XSUAA_MCP_URLwired ontotutorials-srvso the card advertises a non-empty tokenUrl on deployed envs./a2arouteauthenticationTypexsuaa →none(token-as-credential; CAP validates in-process). Same shape as the shipped/mcp-authroute.a2a-instructions.md,a2a-quickstart.md,api-docs/_index.md) + API inventory (api_endpoints.yaml,testing-endpoints.md) rewritten XSUAA → IAS; drift check passes (19 rows).Spec:
docs/superpowers/specs/2026-10-04-a2a-ias-auth-migration-design.mdVerification done
test/unit/a2a/61 passed. Full suite run during impl: 0 auth-induced failures/skips (the hybrid kind un-skipped 1791 tests that a barekind:iaswould have skipped).atxgsg7zi:token_endpoint=https://atxgsg7zi.accounts.ondemand.com/oauth2/token(exactly matches the derivation);client_credentials+client_secret_*supported.atxgsg7zi. Thexsuaa:truehybrid keeps their current XSUAA tokens working, but they must re-point at the IAS token endpoint before the XSUAA fallback is removed (a later follow-up, not this PR). Do not remove the fallback until consumers confirm cutover.atxgsg7zi(noinvalid_client)./a2aoutcomes: IAS bearer → 200; XSUAA bearer → 200 (hybrid); no bearer → 401 +WWW-Authenticate: Bearer+ JSON-RPC-32001.GET /.well-known/agent-card.jsonadvertises a non-emptytokenUrl.Out of scope: IAS mTLS/X509 (secretless), forwarded user-token/on-behalf-of, removing the XSUAA fallback.