Crea API per Single Sign-On con siti di terze parti


13

Il mio sito deve integrarsi con un software di terze parti, che vivrà sul proprio sottodominio, ospitato dalla società di software. Devo fornire agli sviluppatori di terze parti un endpoint che possano utilizzare per effettuare chiamate API (al mio sito wordpress) al fine di consentire agli utenti del mio sito di accedere al sottodominio.

L'altro sito deve autenticare gli utenti dal mio sito tramite una sorta di API.

Non sono sicuro da dove cominciare, ma ho la sensazione che questo sia stato capito da persone più intelligenti di me. Grazie in anticipo!


1
Che tipo di chiamate API saranno necessarie? Cosa stai cercando di fare? Hai esaminato il supporto XML-RPC di WP ( codex.wordpress.org/XML-RPC_Support )?
anu,

L'altro sito deve verificare / autenticare gli utenti dal mio sito WP.
emersonthis

Risposte:


16

Problemi di scripting tra siti

Non è possibile trasferire cookie di autenticazione WP tra domini. Inoltre, non si desidera memorizzare password in chiaro per accedere a un'altra installazione di WP a livello di codice. Pertanto, dovrai far accedere gli utenti a WordPress e quindi accedere al loro stato di accesso tramite un endpoint API dal sito di terze parti. Ciò consente a WordPress di gestire tutta l'autenticazione. È abbastanza sicuro in quanto un utente dovrà accedere fisicamente al lato WP affinché l'endpoint API fornisca i dati a terzi.

Creare un endpoint API

Dai un'occhiata a questo articolo che ho appena scritto qui: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Inoltre, puoi vedere la dimostrazione del codice qui: https://gist.github.com/2982319

Dovrai capire la logica per le tue esigenze di app, ma questo ti permetterà di creare un endpoint in cui puoi servire tutto ciò che vuoi dal lato WordPress.

Dato che stai usando WordPress come sito di autenticazione, puoi usare un segno di spunta come is_user_logged_in (). Se sono connessi, restituisci un oggetto utente a terzi con tutte le informazioni di cui hanno bisogno.

Accesso da parte di terzi

Di terze parti, possono collegarsi alla tua pagina di accesso per un'esperienza senza soluzione di continuità utilizzando la redirect_per query var. Una volta effettuato l'accesso, li riporterà al sito di terze parti.

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

Login remoti

Se devi accedere agli utenti di WordPress da un sito di terze parti, puoi utilizzare alcune semplici funzioni WP elencate in questo sito: http://kuttler.eu/code/log-in-a-wordpress-user-programmatical/

Avrai sicuramente bisogno di usare un segreto condiviso e creare hash basati sul tempo da quel segreto per mantenere le cose sicure. Fondamentalmente, ecco come sarebbe:

Le terze parti inviano una richiesta con un timestamp e un token generati da un segreto condiviso:

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

L'installazione di WordPress riceve la richiesta:

$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!

Abbastanza sicuro che il software di terze parti non abbia nulla a che fare con WP, quindi essenzialmente è single sign-on, ma con WP che funge da provider di autenticazione.
anu,

@anu: è corretto.
emersonthis,

@Brian: sono interessato all'idea di passare a un'installazione multi-sito, ma non capisco perfettamente il punto che hai fatto riguardo ai cookie. Tutto ciò che deve accadere è che il software di terze parti deve verificare che il suo utente sia effettivamente uno dei miei utenti. In caso contrario, il software è autosufficiente e può fornire i propri cookie o altro.
emersonthis il

@Emerson vedo ora. Dispiace per la confusione. È possibile utilizzare l'idea dell'endpoint che ho creato e utilizzare il token condiviso nella meta utente per l'autenticazione. Restituisce una risposta JSON alla terza parte se l'utente esiste.
Brian Fegter,

1
Soluzione molto bella. Potrebbe esserci un problema se le applicazioni sono installate su server diversi e per qualche motivo il tempo di ogni macchina è diverso. Suggerirei di utilizzare counterinvece di time()e passarlo con la richiesta. Entrambe le parti mantengono superato l'ultimo contatore e quando api riceve una richiesta con un nuovo contatore verifica che quello nuovo sia maggiore dell'ultimo. In questo modo un ritardo non può causare alcun danno.
Guyaloni,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.