import { useState } from "react"; import { useMutation } from "@tanstack/react-query"; import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { ShieldCheck, KeyRound, AlertTriangle } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { api, unwrap, ApiError } from "@/lib/api"; export const Route = createFileRoute("/login")({ component: LoginPage, }); function LoginPage() { const navigate = useNavigate(); const [devSubject, setDevSubject] = useState("CN=lab.operator,OU=PKI,O=SMGW"); const [err, setErr] = useState(null); const login = useMutation({ mutationFn: () => unwrap( api.POST("/auth/session", { body: { dev_subject: devSubject }, }), ), onError: (e: ApiError) => setErr(e.message), onSuccess: () => navigate({ to: "/" }), }); return (
Sitzung

Anmeldung über mTLS

Ihr Client-Zertifikat wird vom Reverse Proxy terminiert und im Header{" "} X-Forwarded-Cert-Subject{" "} übergeben. Im Lab-Modus ist ein Dev-Subject als Fallback erlaubt.

{ e.preventDefault(); setErr(null); login.mutate(); }} className="mt-7 space-y-4" >
setDevSubject(e.target.value)} mono placeholder="CN=…" />

Wird ignoriert, sobald der Proxy ein gültiges Cert-Subject mitschickt.

{err && (
{err}
)}
Cookies sind HttpOnly und{" "} SameSite=Strict. Sitzungsdauer 8 h.
); }