Technische Referenz
Nachschlagewerk zu wkidentity: der öffentliche Vertrag, die Einstiege der Einmalcode-Abläufe, die Ablage auf dem Datenträger, jede Einstellung und jede Klasse. Warum die Dinge so gebaut sind, steht in den Konzepten; was Sie tun wollen, auf Identity.
Paket: wkidentity · Fassung: 1.0.0 · Ablage: lib/plugins/wkidentity/
Art: Action- und Helper-Plugin — kein authtype, kein syntax-Tag
Autor: Wolfgang van der Stille Wolfgang.van.der.Stille@gmail.com (The White Knight Labs) · Lizenz: GPL 2
Identity Plugin Contract v1
Der öffentliche Vertrag, über den ein anderes Plugin die aktuelle Sitzung liest und eine höhere
Absicherung anfordern kann, ohne selbst TOTP oder Email-Einmalcodes zu implementieren. Diese Seite
ist die deutsche Kurzfassung für Betreiber; die verbindliche, vollständige Spezifikation (API,
Assurance, Faktoren, Lifecycle, Workbench-Integration, Fehlerverhalten, Beispiel) steht im
Repository: lib/plugins/wkidentity/docs/contract-v1.md.
Warum es diesen Vertrag gibt: Vor ihm hatte wkidentity keine einzige öffentliche Methode —
eine Volltextsuche über jedes andere installierte Plugin ergibt null echte Aufrufe. Der
Fluent-UI-Workbench-Vertrag (siehe Workbench Plugin Contract v1) hatte bereits ein
Deskriptorfeld (requiresIdentity) reserviert und ausdrücklich benannt, dass echte Durchsetzung
bei wkidentitys eigenen Kern-Hooks bleibt — aber nichts stand bereit, das einzulösen.
Fünf Methoden, sonst keine
helper_plugin_wkidentity_contract (plugin_load('helper', 'wkidentity_contract')):
| Methode | Fragt |
|---|---|
currentIdentity() | Wer ist diese Sitzung, aus Core-Sicht? |
currentAssurance() | Was hat diese Sitzung tatsächlich bewiesen? |
supports($capability) | Beherrscht diese Installation eine Fähigkeit überhaupt? |
satisfies($requirement, $scope) | Erfüllt die Sitzung eine Anforderung schon? Reine Abfrage, kein Seiteneffekt. |
require($requirement, $scope, $returnTarget) | Erfüllt jetzt, leitet bei Bedarf zum Step-up um. |
Keine öffentliche Methode gibt ein TOTP-Secret heraus, erzeugt einen Email-Code oder verifiziert
einen Faktor. Diese Primitiven bleiben genau da, wo sie schon waren — auf
helper_plugin_wkidentity, nur von innerhalb dieses Plugins aufgerufen.
Integration mit dem Workbench-Vertrag
Ohne jede Änderung an wkfluentui. Jener Vertrag hat bereits ein Deskriptorfeld
permission (ein Callable, additiv zur ACL, fail-closed), das ein Beitrag genau für diesen Fall
setzen kann:
'permission' => function () { $identity = plugin_load('helper', 'wkidentity_contract'); return $identity !== null && $identity->satisfies('MFA_ANY'); },
Für einen Befehl, der beim tatsächlichen Ausführen einen Step-up verlangen soll (nicht nur beim
Anzeigen ausgeblendet werden soll), ruft die Befehls-Handhabung selbst require() auf.
wkfluentuis requiresIdentity-Feld bleibt genau das, was es schon dokumentiert war —
beratend, ohne Verbraucher — und wird durch diesen Vertrag nicht ersetzt, sondern eingelöst.
Fähigkeits-Erkennung
supports($name) — fünf feste Zeichenketten: identity.authentication, identity.stepup,
identity.factor.totp, identity.factor.mailOtp, identity.assurance.anyMfa. Alle fünf
sind mit dieser Fassung wahr.
Einstiege
Die beiden Kern-Aktionen werden übernommen, nicht ersetzt — vorhandene Lesezeichen, alte E-Mails und die Links auf der Anmeldekarte zeigen alle dorthin, und wer auf dem alten Formular landet und das alte Verhalten vorfindet, hat zwei Systeme zu verstehen statt eines:
| Adresse | Wofür | Bedingung |
|---|---|---|
do=resendpwd | Kennwort zurücksetzen | übernommen, sofern die Aktion nicht abgeschaltet ist |
do=register | Selbstregistrierung | dito |
do=wkidentity_otp&ticket=<id> | Code einlösen; der Link aus der E-Mail | — |
register abgeschaltet ($conf['disableactions'] enthält
register), die Selbstregistrierung ist hier also wirkungslos. Das ist Absicht und kein Defekt:
die Übernahme fragt actionOK() vorher, statt die Aktion erst zu greifen und dann abzulehnen.
Andernfalls zeichnete do=register ein vollständiges Registrierungsformular auf einem Wiki, das
keine Registrierung erlaubt — ein Formular, das aussieht wie eine Einladung und jede Eingabe mit
„nicht erlaubt„ beantwortet.
Ein Ticket im Link ist optional. Wer den Code hat, aber die E-Mail nie ankam, kann ihn über seinen Anmeldenamen einlösen — sonst hielte er einen Code ohne Formular, in das er gehört.
Rangfolge beim Nachweis
recovery_factor entscheidet, welchen Nachweis ein Zurücksetzen annimmt — und die drei Werte
sind keine drei Punkte auf einer Skala. Zwei sind Richtlinie, einer ist eine Messung:
| Wert | Art | Verhalten | Konto ohne Authentifikator |
|---|---|---|---|
mail | Richtlinie | immer Einmalcode per E-Mail. Vorgabe — eine Aktualisierung ändert für niemanden etwas | Einmalcode per E-Mail |
auto | Messung | E-Mail, solange der Postausgang erreichbar ist; Authentifikator, sobald er messbar nicht mehr erreichbar ist | trotzdem E-Mail-Versuch, siehe unten |
totp | Richtlinie | das Postfach wird als Wiederherstellungsweg nie angenommen | kein Selbstbedienungsweg — ein Administrator muss einen Code ausstellen |
auto und totp ändern die Sicherheitslage, nicht nur die Verfügbarkeit. Bei einem
gemailten Code beweist die Kontrolle über das hinterlegte Postfach die Identität; beim
Authentifikator der Besitz des eingerichteten Secrets — und der wird zum einzigen Nachweis, denn
einer Wiederherstellung fehlt das Kennwort definitionsgemäß. Das ist vertretbar und wohl stärker
(kein Transportweg zum Mitlesen, kein Postfach zum Übernehmen, keine Weiterleitungsregel), gibt aber
eines auf, was der E-Mail-Weg umsonst mitbringt: der Kontoinhaber bekommt während eines
Wiederherstellungs-Versuchs nichts mehr zu sehen, erst nach einem abgeschlossenen. Ein
gestohlenes Telefon ist damit leiser als ein gestohlenes Postfach. Was Raten weiterhin begrenzt,
ist otp_attempts — je Vorgang, genau wie bei gemailten Codes.
Zwei Feinheiten, die aus der Bauform folgen und sonst wie Fehler aussehen:
autofällt bei einem Konto ohne Authentifikator auf E-Mail zurück, auch wenn der Port messbar zu ist. Die Messung ist eine Vorhersage, keine Quittung: sie kann veraltet sein, sie sieht keinen lokalen Mailserver, und die Reparatur — eine andere Leitung — ist sofort wirksam und von hier aus unsichtbar. Einen Versuch zu unterlassen kostet den einzigen Weg, den dieses Konto hatte; ihn zu unternehmen kostet eine Zeitüberschreitung.- „Nicht ermittelbar“ heißt Erlaubnis, nie Verweigerung.
autobrauchtwkmailmit SMTP-Transport; ohne das gibt es nichts zu messen und der Wert verhält sich wiemail. Verfügbarkeitsfragen scheitern nach oben offen, sonst verlöre jede nicht messbare Installation einen Weg, den sie problemlos benutzt hat.
Kennwortregel
min_password_length (Vorgabe 14) wird serverseitig geprüft. Eine Regel, die nur im
Hinweis unter dem Feld steht, ist ein Vorschlag — und das Feld ist nicht der Ort, an dem ein
Angreifer tippt. Das Kennwort wird zudem vor dem Code geprüft: wer sich beim neuen Kennwort
zweimal vertippt, soll dafür nicht einen Code verbrauchen und auf den nächsten warten müssen.
Aufräumen
Abgelaufene Vorgänge räumt INDEXER_TASKS_RUN ab — derselbe Wartungslauf, den DokuWiki ohnehin
anstößt. Kein eigener Zeitplan, kein Dienst.
Speicherung: rein dateibasiert, keine Datenbank
Es gibt keine SQLite-/DB-Anbindung. Genau eine Datei pro Nutzer:
data/meta/wkidentity/<login>.secret
- Inhalt: ein kleiner JSON-Umschlag — seit der Sicherheits-Härtung {"v":2,"factors":{"totp"?:{"secret":"BASE32..."},"email"?:{}}}, wobei beide Schlüssel gleichzeitig vorhanden sein können — als Ganzes AES-verschlüsselt mit Cores eigenem
auth_encrypt()/auth_decrypt()(inc/auth.php), demselben Mechanismus, den Core für das „Angemeldet bleiben“-Cookie nutzt. Zwei ältere Formen werden weiterhin gelesen, nie geschrieben: ein unversioniertes {"method":"totp"|"email",...}-Format, und — vor jeder JSON-Form — ein blankes Base32-Secret. - Schlüsselableitung:
hash_hmac('sha256', 'wkidentity-secret-at-rest-v1', auth_cookiesalt())— derselbe Installations-Cookie-Salt wie beim Core-Cookie, aber mit fixem Kontext-Label, sodass niemals dasselbe Schlüsselmaterial wie das Cookie-Feature verwendet wird. isEnrolled()prüft, ob der entschlüsselte Umschlag mindestens einen Faktor enthält — kein Index, kein Cache, keine Registry-Datei.- Das Pending-TOTP-Secret während der Bestätigung liegt ausschließlich in der PHP-Session (Konzepte: Workflow (Enrollment)), nie in dieser Datei. Der Email-Bestätigungscode liegt gesalzen gehasht (
password_hash()seit der Sicherheits-Härtung, zuvor ungesalzenes SHA-256 — siehedocs/threat-model.md, Befund F2) in einer eigenen, kurzlebigen Dateidata/meta/wkidentity/<login>.emailcode. - Neu seit der Sicherheits-Härtung:
data/meta/wkidentity/<login>.totpreplay— eine winzige Datei, die nur den zuletzt akzeptierten HOTP-Zähler für dieses Login hält, damit ein einmal verwendeter TOTP-Code nicht innerhalb seines Toleranzfensters ein zweites Mal angenommen wird (Befund F1). Kein Geheimnis, nur eine Zahl. - Admin-Policy (welche Benutzer/Gruppen/Namensräume/Befehle einen zweiten Faktor bzw. welche Absicherungsstufe verlangen) liegt getrennt davon in
conf/wkidentity-policy.json(siehe Admin-Panel unten) — keine Vermischung von Enrollment-Daten und Durchsetzungs-Regeln. - Offene Einmalcode-Vorgänge liegen wiederum getrennt unter
data/meta/wkidentity/otp/, eine Datei je Vorgang. Der Code selbst steht dort nie im Klartext, nur sein Hash — die Datei beantwortet also „gab es einen Vorgang, wie oft wurde gesendet, wie viele Versuche sind übrig, wann läuft er ab„, aber nie „wie lautet der Code“.
Admin-Panel
Das Paket bringt zwei Verwaltungsbildschirme mit, beide nur für den Superuser:
| Aufruf | Gegenstand |
|---|---|
do=admin&page=wkidentity | zweiter Faktor: Enrollment, Pflicht je Benutzer und Namensraum |
do=admin&page=wkidentity_invites | offene Einmalcode-Vorgänge: Einladung, Nachschub, Adresskorrektur, Abbruch |
Bildschirm für den zweiten Faktor
Fluent-Tab-Muster wie wvdsentra (ARIA-Tablist, ohne JavaScript bleiben alle Panels sichtbar):
| Tab | Inhalt |
|---|---|
| Übersicht | Zähler: enrollt je Methode, „verlangt aber fehlt„, Anzahl pflichtiger Namespaces |
| Benutzer | Enrollte-Liste mit Reset-Button je Zeile, signierter Deep-Link in den usermanager-Bearbeiten-Drawer, Pflege der „TOTP verlangt“-Liste |
| Namespaces | Textarea mit Namespace-Präfixen, die TOTP/Email-Enrollment voraussetzen |
Persistenz getrennt vom DokuWiki-Konfigurationsmanager in conf/wkidentity-policy.json
(PolicyStore.php, 1:1-Muster nach wvdsentra/MappingStore.php: .bak-Backup vor jedem
Überschreiben, robuste Normalisierung).
Einladungen und offene Vorgänge
Aufruf: do=admin&page=wkidentity_invites. Der Bildschirm ist um eine Grenze herum gebaut:
der Code lässt sich nicht nachschlagen. Er steht nur gehasht in der Ablage, und das ist die
Eigenschaft, die den ganzen Ablauf trägt. Also beantwortet der Bildschirm alle übrigen Fragen, die
ein Support-Anruf stellt — wurde ein Vorgang eröffnet, an welche Adresse, wie oft wurde gesendet,
wann läuft der aktuelle Code ab, wie viele Versuche sind übrig, wann schließt der Vorgang.
| Aktion | Wofür |
|---|---|
| Einladen | jemanden benennen und sein Kennwort selbst wählen lassen. Der Code wird danach einmal angezeigt, damit ein Administrator ihn weitergeben kann, wenn die E-Mail nicht ankommt — genau der Fall, für den eine Einladung da ist |
| Nachschicken | neuer Code; der vorherige wird damit ungültig |
| Adresse korrigieren | vertippte Adresse, der häufigste Grund für einen nie angekommenen Code — macht den bereits zur falschen Adresse unterwegs befindlichen Code ebenfalls ungültig |
| Abbrechen | jemand ist nicht mehr dabei, oder die Einladung ging irrtümlich raus |
Dieselben Handgriffe gibt es auf der Kommandozeile
(php bin/plugin.php wkidentity <befehl>), für den Fall, dass die E-Mail niemanden
erreicht: list, code, invite, cancel, purge.
Konfiguration
Admin → Konfigurationseinstellungen ($conf['plugin']['wkidentity'][…]). 19 Einstellungen in
drei Gruppen (seit der Sicherheits-Härtung: plus assurance_ttl).
Einstellungen für den zweiten Faktor
| Einstellung | Standard | Beschreibung |
|---|---|---|
issuer | '''' (leer) | Anbietername in der Authenticator-App; leer = Wiki-Titel ($conf['title']), sonst Fallback „DokuWiki“ |
show_debug_link | an | Link zur internen Testseite im Profil anzeigen |
digits | 6 | Code-Länge (6/7/8) |
period | 30 | Gültigkeitsdauer eines Codes in Sekunden (30/60) |
window | 1 | Toleranz gegen Uhr-Drift in ± Zeitschritten |
allow_email_method | aus | Email-Einmalcode als Alternative zur Authenticator-App freischalten — erst nach verifiziertem Mailversand aktivieren |
enforce_login | aus | Login-Zeitpunkt-Erzwingung für bereits enrollte Nutzer — Kill-Switch, siehe Konzepte: Login-Erzwingung |
login_max_attempts | 5 | Fehlversuche je Login-Vorgang, bevor er verworfen wird |
login_attempt_window | 600 | Gültigkeitsdauer eines auf den zweiten Faktor wartenden Logins in Sekunden. Zugleich die Lebensdauer des wartenden Logins selbst: danach beginnt der Nutzer auch mit null Fehlversuchen wieder beim Kennwort |
assurance_ttl | 3600 | Neu seit der Sicherheits-Härtung. Sekunden, die ein abgeschlossener Step-up (oder ein beim Login bewiesener Faktor) als Absicherung dieser Sitzung zählt, bevor er auf AUTHENTICATED zurückfällt |
Einstellungen der Einmalcode-Abläufe
Ausführliche Begründung im Abschnitt „Einmalcode-Abläufe„ oben — hier nur Werte und Wirkung.
| Einstellung | Standard | Beschreibung |
|---|---|---|
otp_flows | an | Die drei Abläufe überhaupt anbieten. Aus = DokuWiki behält seine eigenen Formulare für resendpwd und register |
recovery_factor | mail | Welchen Nachweis ein Zurücksetzen annimmt: mail, auto oder totp. Siehe „Rangfolge beim Nachweis“ — auto und totp verschieben die Sicherheitslage, nicht nur die Verfügbarkeit |
otp_ttl | 1800 | Gültigkeit eines Codes in Sekunden. Lang genug, dass die E-Mail ankommt, kurz genug, dass es zählt |
otp_attempts | 5 | Fehlversuche je Vorgang. Ein neuer Code füllt sie nicht auf — das ist es, was Raten begrenzt |
otp_resend_gap | 60 | Mindestabstand in Sekunden, bevor für denselben Vorgang ein neuer Code angefordert werden darf. Beim Weg über einen Administrator bewusst übergangen |
reset_ttl | 86400 | Wie lange ein Zurücksetz-Vorgang offen bleibt (1 Tag) |
register_ttl | 172800 | Wie lange eine Selbstregistrierung offen bleibt (2 Tage) |
invite_ttl | 604800 | Wie lange eine Einladung offen bleibt (7 Tage) — lang genug, um ein Wochenende zu überstehen |
min_password_length | 14 | Kürzestes Kennwort, das über diese Abläufe gesetzt werden darf. Serverseitig geprüft |
otp_ttl misst den Code, die drei
*_ttl messen den Vorgang. Wer otp_ttl anhebt, um „mehr Zeit zu geben„, verlängert die
Lebensdauer eines Schlüssels in einem Postfach; wer stattdessen den Vorgang verlängert, gibt Zeit,
ohne das zu tun.
Verhalten bei einem ungültigen Wert
Kein Wert dieser Gruppe führt zu einem Abbruch:
recovery_factor— jeder nicht erkannte Wert wird wiemailbehandelt. Eine unlesbare Einstellung darf nicht ändern, wie Menschen sich wiederherstellen, undmailist, was sie vorher hatten.digitswird auf 6–8 geklemmt,periodauf 5–300,windowauf 0–10; außerhalb liegende Werte fallen auf 6 / 30 / 1 zurück.
digits/period aus der
otpauth://-URI und rechnen immer mit 6 Ziffern / 30 Sekunden. Abweichende Werte funktionieren
nur mit Apps, die diese Parameter tatsächlich auswerten (z. B. Aegis, FreeOTP, 2FAS, Bitwarden) —
mit den beiden großen Apps würde sonst jeder Code abgelehnt.
Technische Referenz
Klasse: action_plugin_wkidentity
Datei: lib/plugins/wkidentity/action.php
| Hook | Zweck |
|---|---|
FORM_UPDATEPROFILE_OUTPUT | Fügt den 2FA-Bereich in das Profilformular ein — App- und Email-Enrollment, je Faktor unabhängiger Status/Deaktivieren-Regler (wkidentity_disable_totp/wkidentity_disable_email) |
ACTION_ACT_PREPROCESS | Verarbeitet wkidentity_action=start|confirm|email_start|email_confirm; claimt wkidentity_debug sowie (via LoginGate/StepUp) wkidentity_verify, wkidentity_stepup und wkidentity_stepup_start |
TPL_ACT_UNKNOWN | Rendert die interne Testseite wkidentity_debug sowie (via LoginGate/StepUp) wkidentity_verify, wkidentity_stepup und wkidentity_stepup_start |
TPL_METAHEADER_OUTPUT | Lädt QR-Bibliothek + Glue-Skripte nur auf den Views, die sie brauchen |
AUTH_ACL_CHECK | Verweigert Lesen/Schreiben in pflichtigen Namespaces, wenn diese Sitzung die geltende Anforderung nicht erfüllt — seit der Sicherheits-Härtung echte Absicherung, zuvor bloße Enrollment (Befund F6) |
ACTION_DENIED_TPLCONTENT | Erklärtext und Weg nach vorn auf der Denied-Seite, wenn die Sperre von diesem Plugin stammt — „nicht enrollt“ oder „nicht bewiesen„, mit unterschiedlichem Link |
TPL_CONTENT_DISPLAY | Sitewide-Warnbanner für „verlangt, aber nicht enrollt“ |
AUTH_LOGIN_CHECK | Delegiert an LoginGate::gate() |
Klasse: helper_plugin_wkidentity
Datei: lib/plugins/wkidentity/helper.php
| Methode | Beschreibung |
|---|---|
generateSecret() | Neues Zufalls-Secret (160 Bit, Base32) |
getCode() / verifyCode() | TOTP-Berechnung bzw. Prüfung mit Drift-Toleranz und Wiederverwendungsschutz ($login-Parameter seit der Sicherheits-Härtung; ein akzeptierter Zeitschritt wird nicht zweimal angenommen) |
buildOtpAuthUri() | otpauth://-URI für den QR-Code |
isEnrolled() / hasFactor() / enrolledFactors() / method() / loadSecret() / saveSecret() / saveEmailMethod() / removeFactor() / removeSecret() | Umschlag-Ablage unter data/meta/wkidentity/ — seit der Sicherheits-Härtung mehrere Faktoren gleichzeitig, unabhängig verwaltet (hasFactor()/enrolledFactors()/removeFactor() neu; method() nur noch eine Anzeige-Kurzform) |
sendEmailChallenge() / verifyEmailChallenge() | Email-Einmalcode: Versand, gesalzen gehashte Ablage mit Ablauf (password_hash() seit der Sicherheits-Härtung, zuvor SHA-256), Einmalprüfung |
Klasse: PolicyStore
Datei: lib/plugins/wkidentity/PolicyStore.php (Namespace dokuwiki\plugin\wkidentity)
| Methode | Beschreibung |
|---|---|
load() / save() | Lädt/persistiert conf/wkidentity-policy.json (Muster wvdsentra/MappingStore.php) |
isUserRequired() | Ob ein Login als „TOTP verlangt„ markiert ist (Warnhinweis) |
isNamespaceRequired() | Präfix-Match gegen die ältere Pflicht-Namespace-Liste |
requirementFor($type, $id) | Direkt an diesen Scope gebundene Anforderung; bei namespace Rückfall auf MFA_ANY, wenn nur die ältere Liste greift |
combine($a, $b) | Statisch, neu seit der Sicherheits-Härtung. Die strengere zweier Anforderungen; $b gewinnt die eine undefinierte TOTP-vs-MAIL_OTP-Konfliktzelle |
effectiveRequirement($scope, $user, $groups) | Neu seit der Sicherheits-Härtung. Die tatsächlich geltende Anforderung — Namespace/direkter Scope, jede Gruppe, der Benutzer, zusammengefaltet über combine(); das, was enforceNamespacePolicy() wirklich aufruft |
Klasse: action_plugin_wkidentity_otpflows
Datei: lib/plugins/wkidentity/action/otpflows.php
Besitzt die Aktion wkidentity_otp und übernimmt die beiden Kern-Einstiege.
| Hook | Zweck |
|---|---|
ACTION_ACT_PREPROCESS | Übernimmt resendpwd und register (nur wenn actionOK()), verarbeitet die vier Operationen |
TPL_CONTENT_DISPLAY | Rendert das jeweilige Formular |
INDEXER_TASKS_RUN | Räumt abgelaufene Vorgänge ab |
id auf dieser Aktion
hätte DokuWikis $ID gesetzt und die anschließende Weiterleitung auf eine Wiki-Seite geschickt,
die nach dem Eingetippten heißt — ein Defekt, den diese Suite bereits einmal bezahlt hat.
Klasse: helper_plugin_wkidentity_otpflows
Datei: lib/plugins/wkidentity/helper/otpflows.php
| Methode | Beschreibung |
|---|---|
recoveryFactor() | Welchen Nachweis dieses Konto unter der geltenden Richtlinie bringen muss |
expectedProof() | Was der Bildschirm verlangen soll. Leitet sich nur aus wikiweitem Zustand ab und nimmt deshalb keinen Anmeldenamen entgegen |
requestReset() / requestRegistration() / invite() | Eröffnet einen Vorgang der jeweiligen Art |
issueRecoveryCode() | Der Weg über einen Administrator. Nicht aus den Web-Formularen erreichbar — diese Methode nennt die Wahrheit über ein Konto und bleibt deshalb Aufrufern vorbehalten, die mehr bewiesen haben als ein Formular beweisen kann. Der Name meint das Kennwort, nicht den zweiten Faktor: die Methode eröffnet einen Einmalcode-Vorgang zum Setzen eines Kennworts und rührt an keinen Faktor. Sie ist kein „Recovery Code“ im Sinne eines aufbewahrten Ersatzcodes — die gibt es nicht, siehe Authenticator verloren oder Telefon defekt |
reissue() | Neuer Code für einen offenen Vorgang; macht den bisherigen ungültig |
redeem() | Löst Code ein und setzt das Kennwort. Prüft das Kennwort vor dem Code |
Klasse: OtpStore
Datei: lib/plugins/wkidentity/Domain/OtpStore.php (Namespace dokuwiki\plugin\wkidentity\Domain)
Die Ablage der Vorgänge, ohne jede DokuWiki-Kenntnis — die Prüfung eines Authentifikator-Codes wird ihr als Rückruf hereingereicht, statt dass sie ihn selbst holt.
| Methode | Beschreibung |
|---|---|
open() / reissue() / redeem() | Vorgang eröffnen, neuen Code ausgeben, Code einlösen |
pending() / findOpenFor() / hasOpenFor() / proofOf() | Auskunft für die Verwaltung |
purge() / drop() | Abgelaufenes abräumen, einzelnen Vorgang abbrechen |
Der Rückruf zur Code-Prüfung kennt drei Antworten, nicht zwei: stimmt, stimmt nicht (kostet einen Versuch — das ist es, was Raten begrenzt) und nicht feststellbar (kostet nichts, weil es unser Fehler ist und nicht der des Besuchers). Fielen die letzten beiden zusammen, könnte ein defekter Authentifikator-Zweig in fünf Anfragen das ganze Budget eines Menschen verbrennen und ihn aus einer Wiederherstellung aussperren, die er nie versuchen durfte.
Klasse: LoginGate
Datei: lib/plugins/wkidentity/LoginGate.php (Namespace dokuwiki\plugin\wkidentity)
| Methode | Beschreibung |
|---|---|
gate() | AUTH_LOGIN_CHECK-Handler: eigener Passwort-Check, hält enrollte Nutzer vor der Session-Finalisierung an |
renderVerifyPage() | Rendert/verarbeitet do=wkidentity_verify (Code-Eingabe, Email-Anforderung, Fehlversuchszähler) |
Klasse: helper_plugin_wkidentity_contract
Datei: lib/plugins/wkidentity/helper/contract.php
Die öffentliche Fassade des Identity Plugin Contract v1 — siehe Abschnitt oben und
docs/contract-v1.md.
| Methode | Beschreibung |
|---|---|
currentIdentity() / currentAssurance() | reine Lesungen, kein Seiteneffekt; currentAssurance() berücksichtigt seit der Sicherheits-Härtung den Ablauf (expiresAt) |
supports() / list() | Fähigkeits-Erkennung |
satisfies() | reine Abfrage. Kombiniert seit der Sicherheits-Härtung immer die eigene, explizite Anforderung des Aufrufers mit PolicyStore::effectiveRequirement() für den Scope (die strengere gewinnt); $requirement = null stützt sich allein auf die Richtlinie |
require() | erfüllt jetzt oder leitet zu StepUp um; verweigert statt zu versuchen, wenn kein passender Faktor eingerichtet ist. Prüft ebenfalls gegen die kombinierte, nicht nur die selbst übergebene Anforderung |
Klasse: StepUp
Datei: lib/plugins/wkidentity/StepUp.php (Namensraum dokuwiki\plugin\wkidentity)
| Methode | Beschreibung |
|---|---|
begin() | statisch, von der Fassade aus aufgerufen: legt den ausstehenden Step-up in der Session ab (seit der Sicherheits-Härtung mit allen eingerichteten Methoden, nicht nur einer), leitet auf do=wkidentity_stepup um |
renderStepUpPage() | Rendert/verarbeitet die Herausforderung — probiert bei zwei eingerichteten Faktoren beide gegen den eingegebenen Code —, schreibt bei Erfolg die Assurance-Marke (Stufe, Faktor, Scope, Ablauf) und leitet zum geprüften Rücksprungziel weiter |
renderStepUpStartPage() | Neu seit der Sicherheits-Härtung. Die Brücke, auf die eine Namespace-Ablehnung mit Grund „nicht bewiesen„ verlinkt (do=wkidentity_stepup_start): errechnet die geltende Anforderung serverseitig neu für die aktuelle Seite und delegiert an require() — nie ein vom Client übergebener Anforderungswert |
recordAssurance() | Öffentlich, neu seit der Sicherheits-Härtung — auch von LoginGate aufgerufen, damit ein beim Login bewiesener Faktor genauso zählt wie einer per Step-up |
Verwandte Themen
- Identity — Einstieg und häufige Aufgaben
- Konzepte — Assurance, Richtlinien-Engine, Abläufe, Sicherheit
- API-Referenz — die Vertragsmethoden, gespiegelt aus dem Repositorium
- Zwei-Faktor-Authentifizierung — die laienverständliche Endnutzer-Anleitung
- Workbench Plugin Contract v1 — dessen
permission-Feld dieser Vertrag nutzt - wkmail — der Postversand, über den Einmalcodes zugestellt werden