Daten, Datenschutz & Sicherheit › Kunden-Link-Token (Angebot/Termin/Bericht)
Kunden-Link-Token (Angebot/Termin/Bericht)
SicherheitLive✓ Geprüft am Sat Sep 05 2026 02:00:00 GMT+0200 (Mitteleuropäische Sommerzeit)Nur wer den Link aus der Nachricht hat, sieht sein Angebot, seinen Termin oder seinen Werkstattbericht — ohne Passwort. Es gibt zwei Bauarten - Angebot und Bericht laufen über einen in der Datenbank hinterlegten Einmal-Link mit Ablaufdatum, der Termin-Link ist stattdessen signiert und braucht keinen Eintrag. Jeder Link öffnet genau eine Sache und sonst nichts.
Bild folgt
Beim Versand erzeugt das System eine lange Zufallszeichenfolge und schickt sie nur ein einziges Mal hinaus — im Link. Gespeichert wird davon lediglich ein Prüfwert, aus dem sich der Link nicht zurückrechnen lässt; wer die Datenbank liest, kann daraus keinen gültigen Link bauen. Jeder Link trägt einen festen Zweck und ist an genau eine Sache gebunden: ein Angebotslink öffnet dieses eine Angebot, ein Berichtslink diesen einen Auftrag. Ein Link zu einer anderen Ressource ist damit nicht möglich. Wird ein neuer Link für dieselbe Sache erzeugt, verliert der alte sofort seine Gültigkeit. Ohne Angabe gilt ein Link 30 Tage. Wird ein Angebot freigegeben, beansprucht das System den Link, bevor die Zustimmung gespeichert wird — sonst könnten zwei gleichzeitige Klicks zwei rechtsgültige Zustimmungen aus einem Link erzeugen. Scheitert danach etwas, wird der Anspruch wieder zurückgenommen. Ist ein Link unbekannt, widerrufen oder abgelaufen, antwortet das Kundenportal immer mit derselben neutralen Meldung, damit von außen niemand erkennt, ob es den Auftrag überhaupt gibt. Zusätzlich bremst eine Missbrauchsbremse zu häufige Aufrufe. Der Termin-Link funktioniert anders: er ist mit einem Hausschlüssel signiert und wird beim Aufruf nachgerechnet, ohne dass ein Eintrag nötig wäre.
- Der Kunde meldet „Link ungültig oder abgelaufen" → entweder sind die 30 Tage um, oder es wurde inzwischen ein neuer Link für dieselbe Sache verschickt; das Büro erzeugt einen frischen Link.
- Der Kunde hat freigegeben, sieht die Seite aber nicht mehr → ein Freigabelink ist nach der Freigabe verbraucht; die Bestätigung liegt beim Auftrag, ein neuer Link ist für die Ansicht nötig.
- Der Kunde bekommt kurzzeitig „Zu viele Anfragen" → die Missbrauchsbremse greift; nach kurzem Warten geht es wieder.
- Ein alter Link aus einer früheren Nachricht funktioniert nicht mehr → das ist gewollt: der zuletzt verschickte Link entwertet alle vorherigen zur selben Sache.
Regelt
Schützt
Genutzt von
- Wie lange ein Termin-Selbstbedienungslink gilt, entscheidet die jeweils aufrufende Stelle über eine optionale Altersgrenze. Ob in Produktion überhaupt eine gesetzt ist, sagen die gelesenen Quellen nicht.
- Berichtslinks werden bewusst nicht beim ersten Aufruf verbraucht, Freigabelinks schon. Ob Kunden einen einmal geöffneten Berichtslink dauerhaft behalten sollen, ist eine Owner-Frage.
- lib/db/customer-tokens.ts
- lib/booking-token.ts
- app/api/angebot/[token]
- app/api/bericht/[token]/pdf/route.ts
| mechanismus | Zwei Bauarten - (1) zustandsbehaftete Einmal-Token in customer_tokens: 256 Bit Zufall, in der Datenbank nur als SHA-256-Hash, gebunden an Zweck (kind) und Ressource (refId), Standard 30 Tage, widerrufbar; (2) zustandsloses HMAC-SHA256-Token fuer Termin-Selbstbedienung (lib/booking-token.ts), zeitkonstant geprueft, ohne Datenbankeintrag |
|---|---|
| gueltigkeit | 30 Tage (Standard) fuer Angebots- und Berichtslinks |
Beleg: lib/db/customer-tokens.ts: 32 Byte Zufall, gespeichert nur als SHA-256-Hash, kind offer_approval|document_view, refId-Bindung, Standard-Gueltigkeit 30 Tage, fail-closed null; lib/booking-token.ts: stateless HMAC-SHA256, timingSafeEqual, optionales maxAgeDays; app/api/angebot/[token]/route.ts: rateLimit 30/min je IP, neutrale 401
Tiefer fragen
Kontext aus dem KFZ-Bozo-Handbuch
Knoten: sec-kunden-token (Sicherheit · Daten, Datenschutz & Sicherheit · live · geprüft Sat Sep 05 2026 02:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) @ 0f0406a1)
Kurz: Nur wer den Link aus der Nachricht hat, sieht sein Angebot, seinen Termin oder seinen Werkstattbericht — ohne Passwort. Es gibt zwei Bauarten - Angebot und Bericht laufen über einen in der Datenbank hinterlegten Einmal-Link mit Ablaufdatum, der Termin-Link ist stattdessen signiert und braucht keinen Eintrag. Jeder Link öffnet genau eine Sache und sonst nichts.
Lies zuerst (Lesebereich, nicht der ganze Baum):
lib/db/customer-tokens.ts
lib/booking-token.ts
app/api/angebot/[token]
app/api/bericht/[token]/pdf/route.ts
Hängt zusammen mit:
app-kundenportal (app/angebot/[token]/page.tsx) · app-kundenportal (app/angebot/[token]/page.tsx) · api-kundenlink-buchung (app/api/angebot/[token]) · sec-rate-limit (lib/rate-limit.ts) · api-kundenlink-buchung (app/api/angebot/[token]) · feat-portal-angebot (app/angebot/[token]/page.tsx) · feat-portal-bericht (app/bericht/[token]/page.tsx) · feat-portal-termin (app/termin/verwalten/[token]/page.tsx)
Offene Fragen der Seite:
Wie lange ein Termin-Selbstbedienungslink gilt, entscheidet die jeweils aufrufende Stelle über eine optionale Altersgrenze. Ob in Produktion überhaupt eine gesetzt ist, sagen die gelesenen Quellen nicht.
Berichtslinks werden bewusst nicht beim ersten Aufruf verbraucht, Freigabelinks schon. Ob Kunden einen einmal geöffneten Berichtslink dauerhaft behalten sollen, ist eine Owner-Frage.
Hausregel 2: Vault-Daten sind für diese Session unsichtbar; Quellpfade auf Vault-Code sind keine Freigabe.
Frage: {{DEINE FRAGE}}
Antworte nur mit Belegen: nenne Datei und Zeile für jede Aussage.
Wenn die Quellen die Frage nicht beantworten, sag das und nenne, was du zusätzlich lesen müsstest.
Weicht die Seite vom Code ab, schlage den Seiten-Patch vor (wiki/seiten/daten-recht-sicherheit/sec-kunden-token.md).