Ich arbeite gerade an einem Prototyp für einen Kunden. Eine der erforderlichen Funktionen ist die Integration in ein internes Benutzerauthentifizierungs-/Registrierungssystem.
Dieses System fungiert als autorisierende Benutzerdatenbank und bietet eine REST-Schnittstelle zum Erstellen neuer Benutzer und zum Authentifizieren gültiger Benutzer.
Ich muss in der Lage sein, neue Benutzer in WP zu erstellen und im Rahmen dieses Prozesses die externe Authentifizierungs-API aufzurufen, um diesen Benutzer zu erstellen oder zu validieren.
Eine Person, die ein gültiger Benutzer ist, der WP jedoch nicht bekannt ist, sollte sich zum Kommentieren anmelden können, ohne sich auf der WP Website registrieren zu müssen.
Eine Person, die auf der gesamten Website angemeldet ist, sollte auch automatisch bei WordPress angemeldet sein.
Ich denke, das Folgende ist der richtige Weg.
Für (1) - gibt es einen Registrierungshaken, den ich verwenden kann?
Für (2) - ich gehe davon aus, dass ich den Authentifizierungsfilter einhänge - dh, wenn jemand versucht, sich anzumelden, fange ich das ab, rufe das externe System an und verarbeite dann entweder die Anmeldung WP oder leite sie um zum Registrierungsprozess wo (1) oer nimmt.
Für (3) - lesen Sie das Login-Cookie auf der Hauptseite und fahren Sie mit (2) fort.
Ich denke, ich muss auch einen Datensatz in die Benutzer- und Usermeta-Tabelle einfügen.
Ergibt das oben Gesagte Sinn - habe ich nicht über etwas nachgedacht? Jeder hat gute Ressourcen, um dabei zu helfen (@hakre - ich habe gesehen, dass Sie daran gearbeitet haben !!).
Ich drücke meinen Kopf immer noch ein wenig dagegen, im Grunde versuche ich, mich in den Authentifizierungsfilter einzuklinken und dies zu verwenden, um:
wp_signon()
unter Verwendung der auf der Master-Site enthaltenen Informationen Cookie (E-Mail und Hash-Passwort) als Zugangsdaten für WPGrundsätzlich möchte ich das Anmeldeformular WP vollständig für Benutzer verbergen, die nur hauptsächlich kommentieren und später eine Möglichkeit finden, Autoren und Administratoren den direkten Zugriff darauf zu ermöglichen.
Es geht ziemlich langsam voran, hier ist, wofür ich etwas Hilfe gebrauchen könnte:
ist der Authentifizierungsfilter der richtige? Es scheint nicht in allen Situationen aufgerufen zu werden, die ich erwarten würde - z. B. zeigt das Meta-Widget Anmelde-/Abmelde-Links an, ohne dass der authentifizierte Hook ausgelöst wird
ich kann wp_signon()
dazu bringen, ein WP_User
-Objekt zurückzugeben (was auf Erfolg hinweist), aber es hat keinen Einfluss auf den Anmeldestatus - dh das Meta-Widget wird auch nach dem Aktualisieren noch in "Login" angezeigt.
Jede Hilfe dankbar erhalten :)
OK, der Ansatz, der für mich funktioniert, ist wie folgt:
Angenommen, die Benutzerdatenbank der Hauptwebsite ist autorisierend. Das Haupt-Site-Login-Cookie enthält eine ID und einen Hash des Site-Passworts.
Rufen Sie das Cookie von der Hauptwebsite ab und überprüfen Sie es anhand der Authentifizierungs-API der Hauptwebsite
Wenn dies gültig ist, verwenden Sie die E-Mail-Adresse aus dem Rückgabewert als 'user_login'
-Wert für WP und das Kennwort für die Hash-Site als WP-Kennwort.
Testen Sie mit wp_authenticate('user_login', 'user_pass')
, ob dieser Benutzer in WP vorhanden ist. Dies gibt ein WP_User
-Objekt bei Erfolg oder ein WP_Error
-Objekt bei einem Fehler zurück.
Wenn WP_Error/is_wp_error()
, verwenden Sie wp_update_user()
, um einen Benutzer zu erstellen (oder einen Benutzer mit einem geänderten Kennwort zu aktualisieren).
Login über wp_set_current_user()
, wp_set_auth_cookie()
und do_action('wp_login, id)
(Dies ist alles in einer Funktion enthalten, die an die Aktion 'init'
angehängt ist.)
Dies scheint zu funktionieren - gültige Site-Benutzer, die WP unbekannt sind, werden automatisch erstellt. Kennwortänderungen werden berücksichtigt. Wenn das Site-Cookie gesetzt ist und der Benutzer WP vorhanden ist, erfolgt die einmalige Anmeldung automatisch und nahtlos.
Das gesamte Authentifizierungssystem ist steckbar. Ich schlage vor, vorhandene Plugins zu prüfen, um eine Vorstellung davon zu bekommen, wie das System überschrieben werden kann. Vielleicht durch einen Blick auf einige LDAP-Plugins ?
Das Aktivieren von Single-Sign-On in WordPress hat mich mehr als 18 Stunden gekämpft, aber möglicherweise dauert es nur ein paar Minuten:
Grundsätzlich sollten Sie https://wordpress.org/plugins/wp-force-login/ und eine geänderte Version von https://as.wordpress.org/plugins/jwt-authenticator verwenden/ und erstellen Sie dann einen auth-geschützten Endpunkt auf Ihrer Hauptsite, der ein JWT (JSON Web Token) generiert und zur speziellen URL Ihrer WordPress-Site zurückleitet.
Siehe vollständigen Code hier .
Einige benutzerbezogene Funktionen sind in wp-includes/pluggable.php
bedingt auf !function_exists()
definiert und können leicht mit Ihren eigenen Versionen überschrieben werden.