Files
patrickandClaude Sonnet 5.5 51b639625f
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Failing after 55s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Successful in 3s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Successful in 3s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Failing after 18s
CI / Web (dms-browser) (push) Failing after 1m18s
CI / Web (pdf-viewer) (push) Failing after 57s
CI / Web (shl) (push) Failing after 11s
Supply-Chain-Scan (Go) / govulncheck (push) Failing after 57s
CI / Core-Modul (Build/Vet/Test) (pull_request) Failing after 1m1s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Successful in 4s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Successful in 4s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Failing after 21s
CI / Web (dms-browser) (pull_request) Failing after 1m16s
CI / Web (pdf-viewer) (pull_request) Failing after 57s
CI / Web (shl) (pull_request) Failing after 11s
common Pflichttest-Gate / pflichttest-gate (pull_request) Successful in 11m57s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Successful in 12m16s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Failing after 52s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Failing after 1m58s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Failing after 21m17s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Successful in 12m19s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Failing after 31s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Failing after 3s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Failing after 3s
DB-Integrationstests / db-tests (pull_request) Canceled after 0s
common/moduleauth: Modul-Token-Verifier (Ed25519, JWKS) und Bearer-Middleware
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 23:40:30 +01:00

63 lines
2.4 KiB
Go

package moduleauth
import (
"context"
"testing"
"time"
)
// TestVerify_AcceptsValidToken belegt den Grundfall: ein vom Testaussteller
// signiertes, gueltiges Token liefert die erwarteten Claims.
func TestVerify_AcceptsValidToken(t *testing.T) {
v, iss := NewTestVerifierAndIssuer()
tok := iss.Token("u1", "acme", "user", "", "")
c, err := v.Verify(context.Background(), tok)
if err != nil || c.Subject != "u1" || c.Tenant != "acme" || c.Role != "user" {
t.Fatalf("claims=%+v err=%v", c, err)
}
}
// TestVerify_RejectsForeignSignature: ein Token eines anderen Schluessels
// (der Verifier kennt dessen kid nicht) wird abgewiesen.
func TestVerify_RejectsForeignSignature(t *testing.T) {
v, _ := NewTestVerifierAndIssuer()
_, other := NewTestVerifierAndIssuer()
if _, err := v.Verify(context.Background(), other.Token("u1", "acme", "user", "", "")); err == nil {
t.Fatal("erwartete fehler bei fremder signatur")
}
}
// TestScope_AudienceMismatchRejected ist der Kern von API-18/F-07: mit
// Expect(audience="mail", ..., enforce=true) gebundene Verifier weisen ein
// Token mit aud="dms" ab, akzeptieren aber aud="mail".
func TestScope_AudienceMismatchRejected(t *testing.T) {
v, iss := NewTestVerifierAndIssuer()
v.Expect("mail", "", true)
if _, err := v.Verify(context.Background(), iss.Token("u1", "acme", "user", "dms", "")); err == nil {
t.Fatal("erwartete fehler bei aud=dms gegen einen mail-gebundenen verifier")
}
if _, err := v.Verify(context.Background(), iss.Token("u1", "acme", "user", "mail", "")); err != nil {
t.Fatalf("erwartete erfolg bei aud=mail, habe: %v", err)
}
}
// TestScope_EnforceRejectsTokenWithoutAudience: mit enforce=true wird ein
// Token OHNE aud-Claim ebenfalls abgewiesen (kein stiller Rueckfall).
func TestScope_EnforceRejectsTokenWithoutAudience(t *testing.T) {
v, iss := NewTestVerifierAndIssuer()
v.Expect("mail", "", true)
if _, err := v.Verify(context.Background(), iss.Token("u1", "acme", "user", "", "")); err == nil {
t.Fatal("erwartete fehler bei fehlendem aud unter enforce=true")
}
}
// TestVerify_RejectsExpiredToken.
func TestVerify_RejectsExpiredToken(t *testing.T) {
v, iss := NewTestVerifierAndIssuer()
expired := iss.TokenExpiringAt("u1", "acme", "user", "", "", time.Now().Add(-2*time.Hour))
if _, err := v.Verify(context.Background(), expired); err == nil {
t.Fatal("erwartete fehler bei abgelaufenem token")
}
}