feat(auth): Anmeldeseiten, TOTP-Einrichtung und Bestaetigung (#004)
Anmeldung, Einrichtung des zweiten Faktors fuer den Notfall-Admin, erneute Bestaetigung vor kritischen Aktionen und die Seite fuer fehlende Rechte. Die Huelle zeigt jetzt den echten Benutzer, und jede Seite prueft die Sitzung selbst; ein struktureller Test haelt das fest. Die Ablaeufe sind im gebauten Stand gegen den Mock-OIDC geprueft (pnpm test:e2e): Admin, Konto ohne Gruppe, Notfall-Admin mit TOTP. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+16
-1
@@ -19,7 +19,9 @@ import { chromium } from "@playwright/test";
|
||||
const BASIS = (process.env["SSHKV_URL"] ?? "http://localhost:3400").replace(/\/$/, "");
|
||||
const ZIEL = process.env["SSHKV_BILDER"] ?? join(process.cwd(), "docs/anleitung/bilder");
|
||||
|
||||
const SEITEN = [
|
||||
/** `oeffentlich`: ohne Anmeldung aufnehmen. Alle anderen nach Anmeldung ueber den Mock-OIDC (#004). */
|
||||
const SEITEN: { name: string; pfad: string; oeffentlich?: boolean }[] = [
|
||||
{ name: "anmelden", pfad: "/anmelden", oeffentlich: true },
|
||||
{ name: "uebersicht", pfad: "/" },
|
||||
{ name: "schluessel-detail", pfad: "/schluessel/beispiel" },
|
||||
];
|
||||
@@ -46,7 +48,20 @@ async function main() {
|
||||
colorScheme: "dark",
|
||||
});
|
||||
const seite = await kontext.newPage();
|
||||
let angemeldet = false;
|
||||
for (const s of seiten) {
|
||||
if (!s.oeffentlich && !angemeldet) {
|
||||
// Anmeldung ueber den Mock-OIDC aus docker-compose.test.yml, Rolle Admin.
|
||||
await seite.goto(`${BASIS}/anmelden`);
|
||||
await seite
|
||||
.getByRole("link", { name: /anmelden/i })
|
||||
.first()
|
||||
.click();
|
||||
await seite.locator('button[data-rolle="admin"]').click();
|
||||
await seite.getByRole("button", { name: "Anmelden", exact: true }).click();
|
||||
await seite.waitForURL(`${BASIS}/`);
|
||||
angemeldet = true;
|
||||
}
|
||||
const antwort = await seite.goto(`${BASIS}${s.pfad}`, { waitUntil: "networkidle" });
|
||||
if (!antwort?.ok()) {
|
||||
fehler.push(`${s.pfad}: HTTP ${antwort?.status() ?? "keine Antwort"}`);
|
||||
|
||||
Reference in New Issue
Block a user