SSO / Authentifizierungsintegration mit externem 'Verzeichnisdienst'


15

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.

  1. Ich muss in der Lage sein, neue Benutzer in WP zu erstellen und als Teil dieses Prozesses die externe Authentifizierungs-API aufzurufen, um diesen Benutzer entweder zu erstellen oder zu validieren.

  2. Eine Person, die ein gültiger Benutzer ist, der WP jedoch nicht bekannt ist, sollte sich zum Kommentieren anmelden können, ohne sich selbst auf der WP-Site registrieren zu müssen.

  3. 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 ein, rufe das externe System an und verarbeite dann entweder die WP-Anmeldung oder leite sie zum Registrierungsprozess weiter, wo ( 1) nimmt oer.

  • 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.

Ist das oben Gesagte sinnvoll? Habe ich nicht über etwas nachgedacht? Jeder hat irgendwelche guten Ressourcen, um dabei zu helfen (@hakre - ich habe gesehen, dass Sie daran gearbeitet haben !!).

Aktualisieren

Ich drücke meinen Kopf immer noch ein bisschen dagegen, im Wesentlichen versuche ich, mich in den Authentifizierungsfilter einzuklinken und dies zu verwenden, um:

  1. Überprüfen Sie, ob ein Anmeldecookie für die 'Master'-Site festgelegt ist, und überprüfen Sie gegebenenfalls die Authentifizierungs-API, und erzwingen Sie bei Gültigkeit eine WP-Anmeldung mit wp_signon()den im Master-Site-Cookie enthaltenen Informationen (E-Mail und Hash-Passwort). als Anmeldeinformationen für WP
  2. Wenn das Cookie nicht gesetzt ist, leiten Sie zur Master-Site-Anmeldeseite um und erhalten Sie entweder eine Anmeldung / Registrierung, dann kehren Sie zu Schritt 1 zurück
  3. Wenn es keinen WP-Benutzer gibt, wenn ein authentifizierter Master-Site-Benutzer vorhanden ist, erstellen Sie ihn und dann eine "transparente" Anmeldung (dh der Benutzer sieht kein WP-Anmeldeformular).

Grundsätzlich möchte ich das WP-Anmeldeformular vollständig für Benutzer verbergen, die lediglich Kommentare hinzufügen 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()ein WP_UserObjekt zurückgeben (zeigt den Erfolg an), 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 :)


Vielleicht sollte dies eine separate Frage sein?
Anu

oh, und ich weiß nicht, ob das überhaupt erwähnt werden darf, aber ich würde gerne einen halben Tag oder so dafür bezahlen - Kontaktdaten in meinem Profil.
Anu

Antworten:


12

OK, der Ansatz, der für mich funktioniert, ist wie folgt:

  1. Angenommen, die Benutzerdatenbank der Hauptwebsite ist autorisierend. Das Haupt-Site-Login-Cookie enthält eine ID und einen Hash des Site-Passworts.

  2. Rufen Sie das Cookie von der Hauptwebsite ab und überprüfen Sie es anhand der Authentifizierungs-API der Hauptwebsite

  3. Falls gültig, verwenden Sie die E-Mail-Adresse aus dem Rückgabewert als 'user_login'Wert für WP und das Kennwort der gehashten Site als Kennwort für WP.

  4. Testen Sie mithilfe von, ob dieser Benutzer in WP vorhanden ist wp_authenticate('user_login', 'user_pass'). Dies gibt ein WP_UserObjekt bei Erfolg oder ein WP_ErrorObjekt bei einem Fehler zurück.

  5. In diesem Fall WP_Error/is_wp_error()können Sie mithilfe wp_update_user()von einen Benutzer erstellen (oder einen Benutzer mit einem geänderten Kennwort aktualisieren).

  6. Einloggen über wp_set_current_user(), wp_set_auth_cookie()unddo_action('wp_login, id)

(Dies ist alles in einer Funktion enthalten, die an die 'init'Aktion angehängt ist. )

Dies scheint zu funktionieren - gültige Site-Benutzer, die WP nicht bekannt sind, werden automatisch erstellt. Kennwortänderungen werden berücksichtigt. Wenn das Site-Cookie gesetzt ist und der WP-Benutzer vorhanden ist, erfolgt die einmalige Anmeldung automatisch und nahtlos.


1
+1 Super Beschreibung / Antwort. Ich hoffe, Sie finden eines Tages die Zeit, um eines Tages ein bisschen mehr Details zu zeigen. Würde uns anderen helfen, den Großteil der Gerichtsverhandlung / Erro zu vermeiden;)
Kaiser

1
Das ist genau das, wonach ich suche. Können Sie uns den Vorgang etwas näher erläutern? Insbesondere die Schritte 1, 2, 3 sind mir nicht sehr klar. Vielen Dank!!
Chifliiiii

3

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 ?


Ja und ohne die Bedeutung von Snarky zu haben, das ist offensichtlich !!
Am

Einige Informationen, die dazu beitragen können, den Anmeldestatus des Benutzers wiederzugeben, finden Sie in meiner Antwort auf diese andere Frage: wordpress.stackexchange.com/questions/8998/…
Dougal Campbell

1

Mehrere benutzerbezogenen Funktion ist bedingt definiert auf !function_exists()in wp-includes/pluggable.phpund ist einfach , mit Ihren eigenen Versionen außer Kraft zu setzen.


1

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 dann eine Authentifizierung erstellen -geschützter Endpunkt auf Ihrer Hauptwebsite, der ein JWT (JSON-Web-Token) generiert und zur speziellen URL Ihrer WordPress-Site zurückleitet.

Den vollständigen Code finden Sie hier .


Danke für deine Antwort. Links nur Antworten werden nicht empfohlen, da Links verschwinden können und Sie die Antwort unbrauchbar machen würden. Es ist besser, die relevanten Bits hier einzubeziehen.
Kaiser
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.