import type { NextRequest } from "next/server"; import { bildeBeweis, getCheckSecret } from "@/lib/domain-check"; export const dynamic = "force-dynamic"; /** * Beweis-Route für den Domain-Check. * * Bewusst **ohne Anmeldung**: Der Aufruf kommt von außen über die zu prüfende * Domain und trägt keine Sitzung mit sich. Preisgegeben wird dabei nichts — * die Antwort ist ein HMAC über die mitgeschickte Zufallszahl. Wer das * Geheimnis nicht kennt, kann ihn nicht bilden; wer ihn sieht, lernt daraus * nichts über das Geheimnis. * * Dass es diese Anwendung gibt, verrät ohnehin schon jede Landingpage. */ export async function GET(request: NextRequest): Promise { const nonce = request.nextUrl.searchParams.get("nonce") ?? ""; // Eine Grenze nach oben, damit die Route nicht als Rechenknecht für fremde // Daten taugt, und eine nach unten, damit sie nicht auf Zuruf antwortet. if (!/^[a-f0-9]{16,64}$/.test(nonce)) { return Response.json( { error: "Es fehlt eine gültige Zufallszahl." }, { status: 400 }, ); } try { const proof = bildeBeweis(await getCheckSecret(), nonce); return Response.json( { app: "qrcode-generator", proof }, { headers: { "Cache-Control": "no-store" } }, ); } catch (error) { console.error("Domain-Check konnte keinen Beweis bilden:", error); return Response.json({ error: "Nicht möglich." }, { status: 500 }); } }