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
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
63 lines
2.4 KiB
Go
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")
|
|
}
|
|
}
|