This demo shows the GitHub Issue Agent running with AuthBridge for transparent, zero-trust token management. AuthBridge provides automatic identity registration, inbound JWT validation, and outbound token exchange — all without changing the agent code.
For a simpler getting-started demo without token exchange, see the Weather Agent demo.
| Guide | Description | Best For |
|---|---|---|
| Manual Deployment | Deploy everything via kubectl and YAML manifests |
Full control, debugging, understanding internals |
| UI Deployment | Import agent and tool via the Rossoctl dashboard | Quick start, UI-driven workflow |
Both guides share the same infrastructure setup (webhook, Keycloak, ConfigMaps) and produce identical AuthBridge security behavior.
- Agent identity — The agent registers with Keycloak using its SPIFFE ID, no hardcoded secrets
- Inbound validation — Requests are validated (JWT signature, issuer, audience) before reaching the agent
- Transparent token exchange — When the agent calls the GitHub tool, AuthBridge exchanges the token automatically
- Subject preservation — The end user's identity (
subclaim) is preserved through the exchange - Scope-based access — The tool uses token scopes to determine public or privileged GitHub API access
- Access control (Alice vs Bob) — Two users with different scopes get different GitHub API access levels: Alice (public only) cannot access private repos, while Bob (privileged) can access both (requires scope forwarding: cortex#139)
User/UI ──► Agent Pod (with AuthBridge sidecars) ──► GitHub Tool
│ │
│ 1. Inbound: validate JWT │
│ 2. Outbound: exchange token │
│ (aud: agent → aud: github-tool) │
│ │
└──── Keycloak (token exchange) ─────────┘
The agent pod has two containers (after cortex#411):
- agent — the A2A agent (port 8000)
- AuthBridge sidecar — combined image; container name depends on
the resolved AuthBridge mode:
- proxy-sidecar (default):
authbridge-proxy(image:authbridge) - envoy-sidecar:
envoy-proxy(image:authbridge-envoy, plus aproxy-initinit container for iptables setup)
- proxy-sidecar (default):
spiffe-helper is bundled inside the combined image and gated
per-workload by SPIRE_ENABLED. Keycloak client registration is
operator-managed (no in-pod sidecar); the operator's
ClientRegistrationReconciler creates a
rossoctl-keycloak-client-credentials-<hash> Secret that the
webhook mounts at /shared/client-{id,secret}.txt.
Both methods produce identical Kubernetes resources (same service names, ports, container names, and labels). The only difference is how you deploy:
| Aspect | Manual | UI |
|---|---|---|
| Agent deployment | kubectl apply -f YAML |
Rossoctl UI "Import New Agent" |
| Tool deployment | kubectl apply -f YAML |
Rossoctl UI "Import New Tool" |
| Image source | Pre-built (ghcr.io/rossoctl/...) |
Built from source via Shipwright |
| Primary interaction | CLI (curl via test-client pod) |
Rossoctl UI chat |
| Env var configuration | In YAML manifests | UI form + optional kubectl patch |
Common names used by both:
- Agent service:
git-issue-agent:8080(targetPort 8000) - Agent container:
agent - Tool service:
github-tool-mcp:9090
| File | Description |
|---|---|
| demo-manual.md | Full manual deployment guide |
| demo-ui.md | UI-driven deployment guide |
| setup_keycloak.py | Keycloak configuration script |
| k8s/configmaps.yaml | ConfigMaps for AuthBridge sidecars |
| k8s/git-issue-agent-deployment.yaml | Agent deployment YAML (manual) |
| k8s/github-tool-deployment.yaml | GitHub tool deployment YAML (manual) |
- All Demos — index of all AuthBridge demos
- Weather Agent Demo — simpler getting-started demo (no token exchange)
- Token-Exchange Routes — route-based token exchange to multiple tools
- Access Policies Proposal — role-based delegation control
- AuthBridge Overview — architecture and design