Initiale Version: MCP-Auth-Sidecar (RFC 9728 + JWT-prüfender Proxy) #1

Merged
jochen merged 4 commits from feature/initial-sidecar into main 2026-09-26 19:20:17 +00:00
Owner

Zweck

Kleiner Sidecar vor einem bestehenden MCP-Gateway. Er liefert die OAuth-Ressourcen, die MCP-Clients (z. B. Claude-Connectoren) brauchen, die FortiWeb und Keycloak allein aber nicht bereitstellen.

Inhalt

  • Protected Resource Metadata (RFC 9728), als Root- und Pfad-Variante
  • Spiegel der Keycloak-Discovery (RFC 8414), auch am Root-Pfad für ältere Clients und für „path insertion“
  • Proxy-Modus:
    • JWT-Prüfung (RS/PS/ES/EdDSA) gegen JWKS mit Schlüsselrotation und Rate-Limit
    • Prüfung von iss, aud, exp/nbf/iat und Keycloak-typ
    • spec-konforme 401/403 mit WWW-Authenticate
    • ungepuffertes SSE
    • X-Auth-*-Identitätsheader, gefälschte Header werden entfernt
  • Metadata-Modus für eine token-prüfende WAF davor
  • Nur Go-Standardbibliothek, ohne go.sum und ohne Fremd-Code in der Supply Chain
  • Distroless-Containerfile mit eingebautem -healthcheck
  • Quadlet-Units und Env-Vorlage
  • kcadm-Skript für den Keycloak-Realm (Audience-Mapper, DCR-Trusted-Hosts, PKCE)
  • Forgejo-CI (gofmt, vet, test -race, build)

Getestet

Lokal mit Go 1.22: go vet, go test -race grün (Token, JWKS, Config, Server-Integration mit Fake-Keycloak und Fake-Gateway). Die Blob-Hashes der gepushten Dateien sind gegen den lokal getesteten Stand abgeglichen.

Nicht getestet / offen

  • deploy/keycloak/setup-realm.sh wurde nicht gegen ein echtes Keycloak ausgeführt. Bitte zuerst in einem Test-Realm laufen lassen.
  • Runner-Label docker in der CI ist eine Annahme.
  • Basis-Images sind noch nicht per Digest gepinnt.
  • Das Skript hat über die API kein Executable-Bit bekommen. Aufruf daher mit sh deploy/keycloak/setup-realm.sh oder vorher chmod +x.

Keine Datenbank, daher keine Migrationen nötig.

## Zweck Kleiner Sidecar vor einem bestehenden MCP-Gateway. Er liefert die OAuth-Ressourcen, die MCP-Clients (z. B. Claude-Connectoren) brauchen, die FortiWeb und Keycloak allein aber nicht bereitstellen. ## Inhalt - **Protected Resource Metadata** (RFC 9728), als Root- und Pfad-Variante - **Spiegel der Keycloak-Discovery** (RFC 8414), auch am Root-Pfad für ältere Clients und für „path insertion“ - **Proxy-Modus**: - JWT-Prüfung (RS/PS/ES/EdDSA) gegen JWKS mit Schlüsselrotation und Rate-Limit - Prüfung von `iss`, `aud`, `exp`/`nbf`/`iat` und Keycloak-`typ` - spec-konforme `401`/`403` mit `WWW-Authenticate` - ungepuffertes SSE - `X-Auth-*`-Identitätsheader, gefälschte Header werden entfernt - **Metadata-Modus** für eine token-prüfende WAF davor - Nur Go-Standardbibliothek, ohne `go.sum` und ohne Fremd-Code in der Supply Chain - Distroless-Containerfile mit eingebautem `-healthcheck` - Quadlet-Units und Env-Vorlage - `kcadm`-Skript für den Keycloak-Realm (Audience-Mapper, DCR-Trusted-Hosts, PKCE) - Forgejo-CI (gofmt, vet, `test -race`, build) ## Getestet Lokal mit Go 1.22: `go vet`, `go test -race` grün (Token, JWKS, Config, Server-Integration mit Fake-Keycloak und Fake-Gateway). Die Blob-Hashes der gepushten Dateien sind gegen den lokal getesteten Stand abgeglichen. ## Nicht getestet / offen - `deploy/keycloak/setup-realm.sh` wurde **nicht gegen ein echtes Keycloak** ausgeführt. Bitte zuerst in einem Test-Realm laufen lassen. - Runner-Label `docker` in der CI ist eine Annahme. - Basis-Images sind noch nicht per Digest gepinnt. - Das Skript hat über die API kein Executable-Bit bekommen. Aufruf daher mit `sh deploy/keycloak/setup-realm.sh` oder vorher `chmod +x`. Keine Datenbank, daher keine Migrationen nötig.
- Protected Resource Metadata (Root- und Pfad-Variante)
- Spiegel der Keycloak-Discovery (RFC 8414, inkl. Root-Pfad für ältere Clients)
- Proxy-Modus: JWT-Prüfung (RS/PS/ES/EdDSA) gegen JWKS mit Rotation,
  spec-konforme 401/403-Challenges, ungepuffertes SSE, Identitäts-Header
- Metadata-Modus für den Betrieb hinter einer token-prüfenden WAF
- Nur Go-Standardbibliothek, distroless Containerfile, Quadlet-Units,
  Keycloak-Setup-Skript, Forgejo-CI
Keycloak-Setup-Skript und README
Some checks failed
ci / test (pull_request) Has been cancelled
4f8dfb3a3a
jochen approved these changes 2026-09-26 19:20:06 +00:00
jochen merged commit 96fc79c4a3 into main 2026-09-26 19:20:17 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
claude/mcp-auth-sidecar!1
No description provided.