Eigene Zugangscode-Schranke statt Cloudflare Access — löst VanVans Login-Problem

Ersetzt die (fehlerhaft auf die GANZE Domain wirkende) Cloudflare-Zero-
Trust-Access-Sperre durch eine eigene, schlanke Lösung nach dem bewährten
Vorbild von "Dogfather Universe": eine Pages-Functions-Middleware
(functions/_middleware.js) prüft bei jeder Anfrage ein HMAC-signiertes
Session-Cookie; ohne gültiges Cookie geht's zu public/gate.html (im Van's-
Design), wo ein Zugangscode eingegeben wird. Zwei getrennte Codes für qciga
und VanVan, 90 Tage gültig, danach neu eingeben. /admin/* ist komplett
ausgenommen — läuft weiter über das echte GitHub-OAuth-Login, das für
VanVan schon funktioniert.

Bonus: die drei separaten Vorschau-Seiten (demo-normal/demo-konto/demo-abo)
sind jetzt überflüssig und entfernt. Stattdessen gibt's ein schwebendes
Umschalter-Widget (Layout.astro), das NUR sichtbar ist, wenn das Gate-Cookie
vorhanden ist (also nur für uns beide) — auf jeder beliebigen Seite kann
per Knopfdruck zwischen "Normaler Besucher", "Angemeldete Kundin" und
"Abonnentin" gewechselt werden, ohne die Seite verlassen zu müssen.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-03 18:55:44 +02:00
co-authored by Claude Sonnet 5
parent 6b1920dfb3
commit ad07584906
9 changed files with 502 additions and 161 deletions
-69
View File
@@ -1,69 +0,0 @@
---
import Layout from "../../layouts/Layout.astro";
import type { Locale } from "../../i18n/config";
const lang: Locale = "de";
// Rein internes Vorschau-Konto (nicht verlinkt, nicht in der Sitemap, noindex) — zeigt, wie das
// Kundenkonto MIT aktivem Abo aussieht: Großes Abo, 14 durchgehend bezahlte Monate, ein noch
// verfügbarer kleiner Teddy, ein bereits eingelöster großer Teddy, ein paar realistische
// Benachrichtigungen und laufender Treuebonus-Fortschritt (nur mit aktivem Abo überhaupt aktiv,
// siehe scripts/account.ts). Wird per JS ins localStorage DIESES Browsers geschrieben, sobald
// die Seite aufgerufen wird — ändert nichts an echten Kundendaten, jede Person, die den Link
// öffnet (auch VanVan), sieht die Vorschau in ihrem eigenen Browser.
const demoAccount = {
loggedIn: true,
name: "Vorschau Kundin",
username: "Vorschau",
email: "[email protected]",
photo: "",
bewerteteBestellungen: [],
treueBestellungen: 6,
treuebonusAktiv: false,
treuebonusArtikelSlug: null,
abo: {
stufe: "gross",
startDatum: "2025-06-03",
bezahltBisDatum: "2026-09-03",
bezahlteMonate: 14,
gekuendigt: false,
gekuendigtAm: null,
kleinTeddyFreigeschaltetGesamt: 2,
grossTeddyFreigeschaltetGesamt: 1,
kleinTeddyEingeloest: 1,
grossTeddyEingeloest: 1,
historie: [],
},
benachrichtigungen: [
{ key: "abo_teddy_klein_frei", datum: "2026-07-03", gelesen: false },
{ key: "abo_zahlung_erfolgreich", datum: "2026-07-03", gelesen: true },
{ key: "abo_zahlung_erfolgreich", datum: "2026-06-03", gelesen: true },
{ key: "abo_teddy_gross_eingeloest", datum: "2026-06-01", gelesen: true },
{ key: "abo_gewechselt", stufe: "gross", datum: "2026-01-15", gelesen: true },
{ key: "abo_abgeschlossen", datum: "2025-06-03", gelesen: true },
],
};
---
<Layout
title="Vorschau: Konto mit aktivem Abo"
description="Interne Vorschau-Seite — zeigt das Kundenkonto mit einem simulierten aktiven Abo."
lang={lang}
path="/demo-abo/"
noindex={true}
>
<section class="section-tight">
<div class="container">
<p class="todo-note">
Interne Vorschau für VanVan — zeigt das Kundenkonto so, wie es mit einem aktiven "Großes Abo"
aussieht (Prämien, Benachrichtigungen, Treuebonus). Wird nur in DEINEM Browser simuliert,
ändert nichts an echten Kundendaten. Du wirst gleich automatisch weitergeleitet …
</p>
<p><a href="/konto/angemeldet/#abo" id="demo-weiter-link">Falls die Weiterleitung nicht klappt: hier klicken →</a></p>
</div>
</section>
</Layout>
<script define:vars={{ demoAccount }}>
localStorage.setItem("vandiy_account_v1", JSON.stringify(demoAccount));
window.location.href = "/konto/angemeldet/#abo";
</script>
-59
View File
@@ -1,59 +0,0 @@
---
import Layout from "../../layouts/Layout.astro";
import type { Locale } from "../../i18n/config";
const lang: Locale = "de";
// Rein internes Vorschau-Konto — zeigt das Kundenkonto einer ganz normalen, angemeldeten Person
// OHNE Abo (Treuebonus dadurch bewusst im gesperrten Zustand, siehe scripts/account.ts). Wird
// per JS ins localStorage DIESES Browsers geschrieben, ändert nichts an echten Kundendaten.
const demoAccount = {
loggedIn: true,
name: "Vorschau Kundin",
username: "Vorschau",
email: "[email protected]",
photo: "",
bewerteteBestellungen: [],
treueBestellungen: 4,
treuebonusAktiv: false,
treuebonusArtikelSlug: null,
abo: {
stufe: null,
startDatum: null,
bezahltBisDatum: null,
bezahlteMonate: 0,
gekuendigt: false,
gekuendigtAm: null,
kleinTeddyFreigeschaltetGesamt: 0,
grossTeddyFreigeschaltetGesamt: 0,
kleinTeddyEingeloest: 0,
grossTeddyEingeloest: 0,
historie: [],
},
benachrichtigungen: [],
};
---
<Layout
title="Vorschau: angemeldetes Konto (ohne Abo)"
description="Interne Vorschau-Seite — zeigt das Kundenkonto einer angemeldeten Person ohne Abo."
lang={lang}
path="/demo-konto/"
noindex={true}
>
<section class="section-tight">
<div class="container">
<p class="todo-note">
Interne Vorschau für VanVan — zeigt das Kundenkonto einer ganz normalen angemeldeten
Person OHNE Abo (Treuebonus ist dadurch bewusst gesperrt zu sehen — genau das Verhalten,
das Kund:innen ohne Abo anspornen soll). Wird nur in DEINEM Browser simuliert, ändert
nichts an echten Kundendaten. Du wirst gleich automatisch weitergeleitet …
</p>
<p><a href="/konto/angemeldet/" id="demo-weiter-link">Falls die Weiterleitung nicht klappt: hier klicken →</a></p>
</div>
</section>
</Layout>
<script define:vars={{ demoAccount }}>
localStorage.setItem("vandiy_account_v1", JSON.stringify(demoAccount));
window.location.href = "/konto/angemeldet/";
</script>
-29
View File
@@ -1,29 +0,0 @@
---
import Layout from "../../layouts/Layout.astro";
import type { Locale } from "../../i18n/config";
const lang: Locale = "de";
---
<Layout
title="Vorschau: normale Ansicht (nicht angemeldet)"
description="Interne Vorschau-Seite — zeigt den Shop so, wie ihn nicht angemeldete Besucher:innen sehen."
lang={lang}
path="/demo-normal/"
noindex={true}
>
<section class="section-tight">
<div class="container">
<p class="todo-note">
Interne Vorschau für VanVan — zeigt den Shop so, wie ihn ein ganz normaler, NICHT
angemeldeter Besucher sieht (räumt dafür ein eventuell simuliertes Konto in diesem Browser
wieder auf). Du wirst gleich automatisch weitergeleitet …
</p>
<p><a href="/" id="demo-weiter-link">Falls die Weiterleitung nicht klappt: hier klicken →</a></p>
</div>
</section>
</Layout>
<script>
localStorage.removeItem("vandiy_account_v1");
window.location.href = "/";
</script>