Créer une API pour l'authentification unique avec un site tiers

13

Mon site doit s'intégrer à un logiciel tiers, qui vivra sur son propre sous-domaine, hébergé par la société de logiciels. Je dois fournir aux développeurs tiers un point de terminaison qu'ils peuvent utiliser pour effectuer des appels API (vers mon site wordpress) afin de permettre aux utilisateurs de mon site d'accéder au sous-domaine.

L'autre site doit authentifier les utilisateurs de mon site via une sorte d'API.

Je ne sais pas par où commencer, mais mon sentiment est que cela a été compris par des gens plus intelligents que moi. Merci d'avance!

emersonthis
la source
1
Quel type d'appels d'API sera nécessaire? Qu'essayez-vous de faire? Avez-vous regardé le support XML-RPC de WP ( codex.wordpress.org/XML-RPC_Support )?
anu
L'autre site doit vérifier / authentifier les utilisateurs de mon site WP.
emersonthis

Réponses:

16

Problèmes de script intersite

Vous ne pouvez pas transférer les cookies d'authentification WP entre les domaines. Vous ne voulez pas non plus stocker de mots de passe en texte brut pour vous connecter par programme à une autre installation WP. Ainsi, vous devrez demander aux utilisateurs de se connecter à WordPress, puis d'accéder à leur état de connexion via un point de terminaison API à partir du site tiers. Cela permet à WordPress de gérer toute l'authentification. Il est assez sécurisé car un utilisateur devra se connecter physiquement du côté WP pour que le point de terminaison API serve les données au tiers.

Créer un point de terminaison API

Consultez cet article que je viens d'écrire ici: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Vous pouvez également voir la démonstration du code ici: https://gist.github.com/2982319

Vous devrez trouver la logique pour les besoins de votre propre application, mais cela vous permettra de créer un point de terminaison où vous pourrez servir tout ce que vous voulez du côté de WordPress.

Puisque vous utilisez WordPress comme site d'authentification, vous pouvez utiliser une vérification comme is_user_logged_in (). S'ils sont connectés, renvoyez un objet utilisateur au tiers avec toutes les informations dont ils ont besoin.

Connexion à partir du tiers

À partir du tiers, ils peuvent créer un lien vers votre page de connexion pour une expérience transparente en utilisant la variable de requête redirect_to. Une fois connecté, il les retransmettra sur le site tiers.

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

Connexions à distance

Si vous devez connecter des utilisateurs à WordPress à partir d'un site tiers, vous pouvez utiliser certaines fonctions WP simples répertoriées sur ce site: http://kuttler.eu/code/log-in-a-wordpress-user-programmatically/

Vous aurez certainement besoin d'utiliser un secret partagé et de créer des hachages basés sur le temps pour garder les choses en sécurité. En gros, voici à quoi cela ressemblerait:

Un tiers envoie une demande avec un horodatage et un jeton généré par un secret partagé:

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

L'installation WordPress reçoit la demande:

$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
la source
Assez certain que le logiciel tiers n'a rien à voir avec WP, donc c'est essentiellement l'authentification unique, mais avec WP agissant comme fournisseur d'authentification.
anu
@anu: C'est vrai.
emersonthis
@Brian: Je suis intéressé par l'idée de passer à une installation multi-sites, mais je ne comprends pas bien l'argument que vous avez fait à propos des cookies. Tout ce qui doit arriver, c'est que le logiciel tiers doit vérifier que son utilisateur est bien l'un de mes utilisateurs. Le logiciel est par ailleurs autosuffisant et peut fournir ses propres cookies ou autre chose.
emersonthis
@Emerson je vois maintenant. Désolé pour la confusion. Vous pouvez utiliser l'idée de point de terminaison que j'ai créée et utiliser un jeton partagé dans la méta utilisateur pour l'authentification. Renvoyez une réponse JSON au tiers si l'utilisateur existe.
Brian Fegter
1
Très belle solution. Il peut y avoir un problème si les applications sont installées sur des serveurs différents et pour une raison quelconque, l'heure de chaque machine est différente. Je suggère d'utiliser counterau lieu de time()et de le transmettre avec la demande. Les deux côtés gardent le dernier compteur passé et quand api reçoit une demande avec un nouveau compteur, il vérifie que le nouveau est supérieur au dernier. De cette façon, un retard ne peut pas faire de mal.
guyaloni