Sie befinden sich hier: start » de » Interne Dokumentation » DokuWiki-Erweiterungen (WvdS) » Identity » Technische Referenz

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

Den Umsetzungsstand und den Verlauf der Sicherheits-Härtung führt Umsetzungsstand und Härtungsverlauf.

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
Auf dieser Installation ist 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:

  • auto fä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. auto braucht wkmail mit SMTP-Transport; ohne das gibt es nichts zu messen und der Wert verhält sich wie mail. 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 — siehe docs/threat-model.md, Befund F2) in einer eigenen, kurzlebigen Datei data/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
Die vier Zeitwerte sind zwei verschiedene Uhren. 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 wie mail behandelt. Eine unlesbare Einstellung darf nicht ändern, wie Menschen sich wiederherstellen, und mail ist, was sie vorher hatten.
  • digits wird auf 6–8 geklemmt, period auf 5–300, window auf 0–10; außerhalb liegende Werte fallen auf 6 / 30 / 1 zurück.
Microsoft Authenticator und Google Authenticator ignorieren 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
Feldnamen tragen ein Präfix, und das ist kein Zierrat. Ein Feld namens 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

de/wiki/dwe/wkidentity/reference.txt · Zuletzt geändert: von 0.0.0.0