import { useState } from 'react' import api from '../utils/api' /** * TOTP einrichten: Geheimnis anzeigen, Code bestätigen, Wiederherstellungscodes einmal zeigen. */ export default function TotpSetupCard({ onEnabled }) { const [secret, setSecret] = useState('') const [otpauthUri, setOtpauthUri] = useState('') const [code, setCode] = useState('') const [recoveryCodes, setRecoveryCodes] = useState([]) const [error, setError] = useState('') const [busy, setBusy] = useState(false) const start = async () => { setError('') setBusy(true) try { const data = await api.setupTotp() setSecret(data.secret || '') setOtpauthUri(data.otpauth_uri || '') setRecoveryCodes([]) } catch (err) { setError(err.message || 'Einrichtung fehlgeschlagen') } finally { setBusy(false) } } const confirm = async (e) => { e.preventDefault() setError('') setBusy(true) try { const data = await api.confirmTotp(code.trim()) if (data?.token) localStorage.setItem('authToken', data.token) setRecoveryCodes(Array.isArray(data?.recovery_codes) ? data.recovery_codes : []) setSecret('') setCode('') } catch (err) { setError(err.message || 'Code nicht akzeptiert') } finally { setBusy(false) } } return (
Authenticator-App (zum Beispiel Aegis, 1Password oder Microsoft Authenticator) öffnen und das Geheimnis manuell eintragen. Den otpauth-Link nicht an Dritte geben.
{error ? ({error}
) : null} {!secret && recoveryCodes.length === 0 ? ( ) : null} {secret ? ( ) : null} {recoveryCodes.length > 0 ? (Diese acht Codes jetzt sichern. Die Seite bleibt stehen, bis du unten bestätigst. Ein Neuladen löscht die Anzeige. Neue Codes kannst du danach in den Einstellungen erzeugen.