feat: Grundgerüst mit Anmeldung, Layout und Design-Tokens
Next.js 16, Prisma 7, Tailwind 4 und Vitest/Playwright, Konfiguration aus Laufzettel übernommen, weil dort derselbe Stack erprobt ist. Die Farben der Branding-Vorgabe stehen als Tokens in globals.css, das helle Theme setzt dieselben Namen neu. Amber und Rot sind dort abgedunkelt, sonst reicht der Kontrast nicht – ein Test prüft beide Themes gegen 4,5:1. Anmeldung mit lokalem Benutzer, Rolle je Anfrage aus der Datenbank, Audit-Log per Trigger nur anhängbar. Geprüft im gebauten Stand auf 1440 px und 390 px. Closes #001 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
import { SignJWT } from "jose";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { sitzungErzeugen, sitzungLesen } from "@/lib/sitzung";
|
||||
|
||||
describe("Sitzungscookie", () => {
|
||||
it("liest ein selbst ausgestelltes Token zurück", async () => {
|
||||
const jwt = await sitzungErzeugen({ benutzerId: "b1", herkunft: "passwort" });
|
||||
expect(await sitzungLesen(jwt)).toMatchObject({ benutzerId: "b1", herkunft: "passwort" });
|
||||
});
|
||||
|
||||
it("verwirft fehlende, verfälschte und fremd signierte Tokens", async () => {
|
||||
expect(await sitzungLesen(undefined)).toBeUndefined();
|
||||
const jwt = await sitzungErzeugen({ benutzerId: "b1", herkunft: "passwort" });
|
||||
expect(await sitzungLesen(jwt.slice(0, -2) + "xx")).toBeUndefined();
|
||||
const fremd = await new SignJWT({ herkunft: "passwort" })
|
||||
.setProtectedHeader({ alg: "HS256" })
|
||||
.setSubject("b1")
|
||||
.setIssuer("proxdeploy")
|
||||
.setAudience("proxdeploy-web")
|
||||
.setIssuedAt()
|
||||
.setExpirationTime("1h")
|
||||
.sign(new TextEncoder().encode("ein-ganz-anderes-geheimnis-mit-genug-zeichen"));
|
||||
expect(await sitzungLesen(fremd)).toBeUndefined();
|
||||
});
|
||||
|
||||
it("enthält keine Rolle – die kommt je Anfrage aus der Datenbank", async () => {
|
||||
const jwt = await sitzungErzeugen({ benutzerId: "b1", herkunft: "oidc" });
|
||||
const inhalt = JSON.parse(Buffer.from(jwt.split(".")[1]!, "base64url").toString());
|
||||
expect(inhalt).not.toHaveProperty("rolle");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user