Erstellen Sie eine API für Single Sign-On mit der Site eines Drittanbieters

13

Meine Website muss in eine Software von Drittanbietern integriert werden, die in einer eigenen Subdomain des Softwareunternehmens betrieben wird. Ich muss den Entwicklern von Drittanbietern einen Endpunkt bereitstellen, mit dem sie API-Aufrufe (an meine WordPress-Site) vornehmen können, damit die Benutzer meiner Site auf die Unterdomäne zugreifen können.

Die andere Site muss Benutzer von meiner Site über eine API authentifizieren.

Ich bin nicht sicher, wo ich anfangen soll, aber ich habe das Gefühl, dass dies von Leuten herausgefunden wurde, die schlauer sind als ich. Danke im Voraus!

emersonthis
quelle
1
Welche Art von API-Aufrufen wird benötigt? Was versuchst du zu machen? Haben Sie sich die XML-RPC-Unterstützung von WP angesehen ( codex.wordpress.org/XML-RPC_Support )?
Anu
Die andere Site muss Benutzer von meiner WP-Site überprüfen / authentifizieren.
emersonthis

Antworten:

16

Siteübergreifende Skriptprobleme

Sie können keine WP-Authentifizierungs-Cookies zwischen Domains übertragen. Sie möchten auch keine Klartextkennwörter speichern, um sich programmgesteuert bei einer anderen WP-Installation anzumelden. Daher müssen sich Benutzer bei WordPress anmelden und dann über einen API-Endpunkt von der Website eines Drittanbieters auf ihren Anmeldestatus zugreifen. Auf diese Weise kann WordPress die gesamte Authentifizierung durchführen. Dies ist ziemlich sicher, da sich ein Benutzer physisch auf der WP-Seite anmelden muss, damit der API-Endpunkt die Daten für den Drittanbieter bereitstellt.

Erstellen Sie einen API-Endpunkt

Lesen Sie den Artikel, den ich gerade hier geschrieben habe: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Sie können die Code-Demonstration auch hier sehen: https://gist.github.com/2982319

Sie müssen die Logik für Ihre eigenen App-Anforderungen herausfinden, aber dies ermöglicht es Ihnen, einen Endpunkt zu erstellen, auf dem Sie alles bereitstellen können, was Sie von der WordPress-Seite wollen.

Da Sie WordPress als Authentifizierungssite verwenden, können Sie eine Prüfung wie is_user_logged_in () verwenden. Wenn sie angemeldet sind, geben Sie ein Benutzerobjekt mit den erforderlichen Informationen an den Dritten zurück.

Anmelden von einem Drittanbieter

Über die Abfragevariable "redirect_to" können sie von Drittanbietern eine Verknüpfung zu Ihrer Anmeldeseite herstellen, um eine nahtlose Darstellung zu erhalten. Sobald Sie angemeldet sind, werden sie an die Website eines Drittanbieters weitergeleitet.

http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com

Remoteanmeldungen

Wenn Sie Benutzer von einer Website eines Drittanbieters bei WordPress anmelden müssen, können Sie einige einfache WP-Funktionen verwenden, die auf dieser Website aufgeführt sind: http://kuttler.eu/code/log-in-a-wordpress-user-programmatically/

Sie müssen auf jeden Fall ein gemeinsames Geheimnis verwenden und zeitbasierte Hashes aus diesem Geheimnis erstellen, um die Sicherheit zu gewährleisten. Grundsätzlich sieht es so aus:

Ein Dritter sendet eine Anfrage mit einem Zeitstempel und einem Token, die von einem gemeinsamen Geheimnis generiert wurden:

$shared_secret = 'foobar'; //do not send this to the API endpoint
$timestamp = time();
$token = md5($shared_secret.$time_stamp);

Die WordPress-Installation erhält die Anfrage:

$shared_secret = 'foobar';
$timestamp = esc_attr($_GET['timestamp']);

if((time() - $timestamp) > 30) # Threshold is 30 seconds
    //do something here - TOKEN expired!

$token = md5($share_secret.$timestamp);
$token_to_check = esc_attr($_GET);

if($token == $token_to_check)
    //authenticated!
Brian Fegter
quelle
Ziemlich sicher, dass die Software von Drittanbietern nichts mit WP zu tun hat. Im Grunde genommen handelt es sich also um Single Sign-On, sondern darum, dass WP als Authentifizierungsanbieter fungiert.
Anu
@anu: Das stimmt.
emersonthis
@Brian: Ich bin an der Idee interessiert, zu einer Installation mit mehreren Standorten zu wechseln, aber ich verstehe den Punkt, den Sie über die Cookies geäußert haben, nicht ganz. Alles, was passieren muss, ist, dass die Software eines Drittanbieters überprüft, ob der Benutzer tatsächlich einer meiner Benutzer ist. Die Software ist ansonsten autark und kann eigene Cookies oder was auch immer bereitstellen.
emersonthis
@Emerson Ich sehe jetzt. Entschuldigung für die Verwirrung. Sie können die Endpunktidee verwenden, die ich erstellt habe, und das gemeinsam genutzte Token in Benutzer-Meta für die Authentifizierung verwenden. Gibt eine JSON-Antwort an den Drittanbieter zurück, wenn der Benutzer vorhanden ist.
Brian Fegter
1
Sehr schöne Lösung. Möglicherweise liegt ein Problem vor, wenn Anwendungen auf verschiedenen Servern installiert sind und aus irgendeinem Grund die Uhrzeit der einzelnen Computer unterschiedlich ist. Ich würde vorschlagen, counteranstatt zu verwenden time()und es mit der Anfrage zu übergeben. Beide Seiten lassen den letzten Zähler bestehen, und wenn die API eine Anfrage mit einem neuen Zähler erhält, wird überprüft, ob der neue Zähler größer als der letzte ist. Auf diese Weise kann eine Verzögerung keinen Schaden anrichten.
Guyaloni