CMS:USER_2FA
Zweiten Faktor des angemeldeten Frontend-Users anzeigen, einrichten (Authenticator-App oder Code per E-Mail) und abschalten.
(CMS:USER_2FA [parameter=wert …])
Methode: Modules\Record\RecordUser::cmsTwoFactor()
Parameter
| Parameter | Wert | Standard | Pflicht | Beschreibung |
|---|---|---|---|---|
function |
status / totp_setup / totp_enable / code_enable / disable / recovery_renew |
status |
Was der Befehl tut (siehe unten). | |
submit |
Textwert |
– | Schreibende Funktionen laufen nur, wenn in diesem Feld ein Text enthalten ist. | |
data |
PHP-Variablenname |
data |
Name des PHP-Arrays mit den Eingaben. | |
codefield |
Feldname |
code |
Eingabefeld für den App-Code in data[…]. |
|
currentfield |
Feldname |
current_password |
Eingabefeld für das Passwort in data[…]. |
|
message[…] |
Standardmeldung |
– | Fehlermeldungen. Im Index: Anwendungsfall; im Wert: Meldungstext. | |
cookiename |
Cookiename |
usess |
Name des Session-Cookies [a-z0-9]. | |
csrf |
true / false |
true |
true: Schreibende Funktionen verlangen ein Token aus CMS:USER_TOKEN. |
Anwendung
Der Befehl gehört auf eine geschützte Seite des Kundenkontos (nach
CMS:USER_PROTECT). Er wirkt nur, wenn der Profil-Bereich einen zweiten
Faktor zulässt (Einstellung „Zweiter Faktor“ nicht „aus“, sonst Meldung policy).
function |
Wirkung | Bestätigt mit |
|---|---|---|
status |
nur lesen | – |
totp_setup |
neuen Schlüssel für die Authenticator-App erzeugen – gespeichert wird noch nichts: $set['totp_setup'] = token, qr (fertiges HTML mit QR-Code), secret (zum Abtippen, in Vierergruppen), uri (otpauth://…, öffnet auf dem Telefon direkt die App), qr_script (Adresse der QR-Bibliothek) |
– |
totp_enable |
Schlüssel speichern, zehn Wiederherstellungscodes erzeugen ($set['recovery_codes'], nur jetzt im Klartext) |
data[token] und dem ersten Code aus der App (data[code]) |
code_enable |
Code per E-Mail bei jeder Anmeldung | Passwort (data[current_password]); ist eine App eingerichtet, dem App-Code |
disable |
abschalten – verlangt der Bereich immer einen zweiten Faktor, wird aus der App der Code per E-Mail | App-Code oder Wiederherstellungscode bzw. Passwort |
recovery_renew |
neue Wiederherstellungscodes, die alten verfallen | App-Code |
Nach jeder Funktion stehen in $set: second_factor ('', totp, email),
second_factor_policy (Einstellung des Bereichs: none, optional, new_device,
required), second_factor_since (UTC), recovery_count; nach einer Änderung
second_factor_changed (totp_enabled, totp_disabled, code_enabled,
code_disabled, recovery_renewed) – etwa für eine Hinweis-E-Mail an den Frontend-User.
Zum Einrichten scannt der Frontend-User den QR-Code mit der App; er enthält den Schlüssel
(nicht die Codes – die erzeugt die App danach selbst, je sechs Ziffern). Alternativ tippt
er den Schlüssel ab oder öffnet auf dem Telefon den Link. $set['totp_setup']['qr']
bringt alles mit: ein Element mit dem QR-Code, die Bibliothek qrcode-generator (dieselbe
wie im Backend, aus dessen Assets) und ein kleines Script, beide mit der Nonce der Seite –
es läuft also auch unter einer durchgesetzten Script-Policy. Geben Sie es nur aus
(echo), die Größe steuern Sie per CSS (.c9-qr { width: 200px }).
<?php
$isPost = ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST';
$action = $isPost ? (string)($_POST['action'] ?? '') : (isset($_GET['setup']) ? 'totp_setup' : 'status');
$submit = $isPost ? '1' : '';
?>
(CMS:USER_PROTECT errortemplate=u_login)
(CMS:USER_2FA function="$action" submit="$submit")
<p class="error">(CMS:MESSAGE)</p>
<?php if (!empty($set['recovery_codes'])) { ?>
<p>Ihre Wiederherstellungscodes (bitte sicher aufbewahren):</p>
<ul><?php foreach ($set['recovery_codes'] as $c) echo '<li>' . htmlspecialchars($c) . '</li>'; ?></ul>
<?php } ?>
<?php if (!empty($set['totp_setup'])) { $s = $set['totp_setup']; ?>
<?php echo $s['qr']; ?>
<p>Schlüssel für Ihre Authenticator-App: <code><?php echo htmlspecialchars($s['secret']); ?></code>
– oder <a href="<?php echo htmlspecialchars($s['uri']); ?>">in der App öffnen</a>.</p>
<form method="post">
(CMS:USER_TOKEN)
<input type="hidden" name="action" value="totp_enable">
<input type="hidden" name="data[token]" value="<?php echo htmlspecialchars($s['token']); ?>">
<input name="data[code]" autocomplete="one-time-code" required>
<button>Einschalten</button>
</form>
<?php } elseif ($set['second_factor'] === '') { ?>
<p><a href="?setup=1">Authenticator-App einrichten</a></p>
<?php } ?>
Meldungs-Indizes: auth (nicht angemeldet), policy, code (App-Code falsch),
current (Passwort falsch), setup (Einrichtung abgelaufen – 15 Minuten), blocked
(zu viele Fehlversuche), token. Falsche Codes und Passwörter zählen wie bei der
Anmeldung.
Hat ein Frontend-User Telefon und Wiederherstellungscodes verloren, setzt der Betreiber den zweiten Faktor im Backend zurück (Datensatz des Profils, Menü „Zweiter Faktor“).
Parameter im Einzelnen
function
(CMS:USER_2FA function=status)
(CMS:USER_2FA function="$action" submit="$submit")
submit
Nur schreibende Funktionen brauchen ihn – sie gehören in ein POST-Formular:
<?php $submit = ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST' ? '1' : ''; ?>
data, codefield, currentfield
(CMS:USER_2FA function=disable submit="$submit" data=sec codefield=otp currentfield=pw)
message
(CMS:USER_2FA function="$action" submit="$submit" message[code]="Der Code stimmt nicht.")
Stand: camindo CMS 9.1.3