Aufgabe 20 - Der Türsteher
Aufgabe 20 - Der Türsteher
Abschnitt betitelt „Aufgabe 20 - Der Türsteher“Worum geht es?
Abschnitt betitelt „Worum geht es?“Middleware und Schema-Validierung bringen Ihre API auf Produktionsniveau: zentrales Logging, echte Zugriffskontrolle statt des Rollen-Header-Provisoriums, zod-Schemas statt Handprüfungen und ein Fehlerformat, das technisch überall gleich ist. Am Ende steht der Angriffstest durch die Sitznachbarin oder den Sitznachbarn (siehe Kapitel Middleware und Validierung).
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel Middleware und Validierung; Ihr Buffet-Projekt nach Aufgabe 19;
zod.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie setzen Middleware für Querschnittsaufgaben (Logging, Zugriffskontrolle) ein.
- Sie validieren Eingaben mit zod-Schemas und leiten Typen mit
z.inferab. - Sie halten ein konsistentes Fehlerformat technisch über die ganze API durch.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: Logging-Middleware nach dem Kapitelmuster einrichten (Teil A).
- Reorganisation und Transfer: Zugriffskontrolle und Schema-Validierung in das bestehende Projekt integrieren (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: die API einem Angriffstest aussetzen und die Ergebnisse bewerten (Teil D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Teil A - Das Request-Log
Abschnitt betitelt „Teil A - Das Request-Log“- Legen Sie
middleware.tsmit Matcher auf/api/:path*an: Jede API-Anfrage wird geloggt (Zeitstempel, Methode, Pfad). - Lesen Sie das Log: Welche Endpunkte ruft ein Aufruf der Verwaltungsseite tatsächlich auf, und wie oft? Überraschungen (doppelte Aufrufe, unerwartete Requests) notieren; das Log ist ab jetzt Ihr Diagnosewerkzeug.
Teil B - Echte Zugriffskontrolle
Abschnitt betitelt „Teil B - Echte Zugriffskontrolle“- Ersetzen Sie den
x-role-Header aus Aufgabe 15: Eine einfache Login-Route (POST /api/loginmit einem im Unterricht vereinbarten Kennwort) setzt ein signiertes Cookie; das Geheimnis zum Signieren kommt aus.env.local(in der.gitignore!). - Die Middleware prüft das Cookie und weist Verwaltungsrouten ohne Buffet-Rolle mit
401(nicht angemeldet) beziehungsweise403(falsche Rolle) ab, im Fehlerformat des Vertrags. - Aus den Route Handlers fliegt jede Rollenabfrage heraus; die Prüfung existiert genau einmal. Halten Sie den Diff fest. Dank der Kapselung aus Aufgabe 16 ändert sich im Client nur die eine Hilfsfunktion.
Teil C - Schema statt Handarbeit
Abschnitt betitelt „Teil C - Schema statt Handarbeit“- Definieren Sie zod-Schemas für alle Request-Bodies (Bestellung, Artikel, Login) in
lib/schemas.ts, inklusive der Regeln aus der Doku (1 bis 5 Positionen, Preis größer 0, Mengen ganzzahlig, …). - Ersetzen Sie die handgeschriebene Formvalidierung durch
safeParse; Validierungsfehler antworten mit400und feldgenauendetailsim einheitlichen Fehlerformat. Fachliche Prüfungen (Menge reicht, Bestellschluss) bleiben im Service; ziehen Sie die Grenze bewusst und dokumentieren Sie sie in einem Kommentar. - Leiten Sie die TypeScript-Typen mit
z.inferaus den Schemas ab und löschen Sie die dadurch überflüssigen Interface-Duplikate. Notieren Sie im Commit, welches Duplikat verschwunden ist: Vertrag, Prüfung und Typ sind jetzt eine Quelle.
Teil D - Expertenteil: Der Angriffstest
Abschnitt betitelt „Teil D - Expertenteil: Der Angriffstest“- Übergeben Sie Ihre laufende API samt HTTPie an Ihre Sitznachbarin oder Ihren Sitznachbarn: zehn Minuten freies Angreifen. Pflichtprogramm: Bestellung mit 999 Positionen, negativer Preis, String statt Zahl, kaputtes JSON, Verwaltungszugriff ohne Login und mit falscher Rolle, überlanger Artikelname, unbekannte Felder im Body.
- Bestehenskriterium: Jede Antwort ist kontrolliert (
400/401/403/404/409im Fehlerformat); kein500, kein Stack Trace, kein Absturz. Protokoll führen: Angriff, Antwort, bestanden ja/nein. - Jeder nicht bestandene Fall wird behoben und der Angriff wiederholt; das Protokoll dokumentiert beide Durchgänge.
- Beurteilen Sie in drei Sätzen: Welche Angriffe hat die Middleware abgefangen, welche das Schema, welche der Service? Passt diese Verteilung zur Architektur, oder ist etwas an der falschen Stelle gelandet?
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Warum gehört die Rollenprüfung in die Middleware und nicht in jeden Handler?
- Was unterscheidet
401von403? - Was leistet
safeParsegegenüberparse, und warum passt es besser an die API-Grenze? - Welches Duplikat beseitigt
z.infer, und warum ist das mehr als Kosmetik? - Warum darf eine
500-Antwort keine internen Details enthalten?
Git-Repository, der Diff aus Teil B, und das zweistufige Angriffsprotokoll aus Teil D.