Echtes Google-/PayPal-Login: OAuth 2.0 + PKCE, eigene Kundendatenbank, DSGVO-Selbstbedienung

Kundenkonten sind jetzt genauso echt wie die PayPal-Zahlung: server-geprüftes OAuth 2.0 mit
PKCE für Google und "Log in with PayPal" (functions/_shared/oauth.js, oauth-handlers.js),
neue D1-Tabelle "customers" (bewusst ohne Passwort-Feld), eigene von der Zugangscode-Schranke
getrennte Sitzungs-Logik (customer-auth.js). Echte DSGVO-Rechte direkt im Kontobereich:
Daten herunterladen (Art. 15/20) und Konto unwiderruflich löschen (Art. 17), Bestellungen
bleiben aus gesetzlichen Gründen erhalten. Datenschutzerklärung entsprechend ergänzt.

Ohne echte Google-/PayPal-Zugangsdaten zeigt der Login-Button ehrlich einen
"noch nicht eingerichtet"-Hinweis statt eine Anmeldung vorzutäuschen.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-04 01:45:55 +02:00
co-authored by Claude Sonnet 5
parent e80aba5ca6
commit bf0d169015
24 changed files with 985 additions and 127 deletions
+23
View File
@@ -0,0 +1,23 @@
-- Migration 0004: echte Kundenkonten für Google-/PayPal-Login.
--
-- Bewusst OAuth-only (kein eigenes Passwort-Feld): dadurch entfällt jede Passwort-Sicherheits-
-- verantwortung für uns komplett (kein Hashing, kein Passwort-Leck-Risiko) — Google/PayPal
-- übernehmen die eigentliche Identitätsprüfung, wir speichern nur, WER (per Provider-ID)
-- eingeloggt ist. Siehe functions/_shared/customer-auth.js + functions/api/auth/*.
CREATE TABLE IF NOT EXISTS customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
last_login_at TEXT NOT NULL,
-- "google" oder "paypal" — jeweils per OpenID Connect, siehe functions/_shared/oauth.js.
provider TEXT NOT NULL CHECK (provider IN ('google', 'paypal')),
-- Die eindeutige, unveränderliche Nutzer-ID VOM PROVIDER (z.B. Googles "sub"-Feld) — NICHT die
-- E-Mail-Adresse, weil E-Mail-Adressen sich ändern können, die Provider-ID aber nicht.
provider_user_id TEXT NOT NULL,
email TEXT NOT NULL,
name TEXT,
UNIQUE (provider, provider_user_id)
);
CREATE INDEX IF NOT EXISTS idx_customers_email ON customers(email);
+15
View File
@@ -64,3 +64,18 @@ CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(status);
CREATE INDEX IF NOT EXISTS idx_orders_land ON orders(land);
CREATE INDEX IF NOT EXISTS idx_orders_created_at ON orders(created_at);
CREATE INDEX IF NOT EXISTS idx_orders_gutschein_email ON orders(gutschein_code, kunde_email);
-- Echte Kundenkonten (Google-/PayPal-Login, siehe migration-0004-kundenkonten.sql für die
-- ausführliche Begründung — bewusst OAuth-only, kein eigenes Passwort-Feld).
CREATE TABLE IF NOT EXISTS customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
last_login_at TEXT NOT NULL,
provider TEXT NOT NULL CHECK (provider IN ('google', 'paypal')),
provider_user_id TEXT NOT NULL,
email TEXT NOT NULL,
name TEXT,
UNIQUE (provider, provider_user_id)
);
CREATE INDEX IF NOT EXISTS idx_customers_email ON customers(email);