Intégration SSO / authentification avec un «service d'annuaire» externe


15

Je suis sur le point de commencer à travailler sur un prototype pour un client - et l'une des fonctionnalités requises est l'intégration avec un système interne d'authentification / d'enregistrement des utilisateurs.

Ce système fera office de base de données d'utilisateurs faisant autorité et fournit une interface RESTful pour créer de nouveaux utilisateurs et authentifier des utilisateurs valides.

  1. J'ai besoin de pouvoir créer de nouveaux utilisateurs dans WP et dans le cadre de ce processus, faire un appel à l'API d'authentification externe pour créer / valider cet utilisateur.

  2. Une personne qui est un utilisateur valide mais non connu de WP devrait pouvoir se connecter pour commenter, sans avoir besoin de s'inscrire sur le site WP lui-même.

  3. Une personne connectée au site Web global doit également être automatiquement connectée à WordPress.

Je pense que ce qui suit est la voie à suivre.

  • Pour (1) - existe-t-il un crochet d'enregistrement que je peux utiliser?

  • Pour (2) - Je suppose que je raccorde le filtre d'authentification - c'est-à-dire lorsque quelqu'un essaie de se connecter, je le piège, j'appelle le système externe, puis je traite la connexion WP ou je le redirige vers le processus d'enregistrement où ( 1) prend oer.

  • Pour (3) - lire le cookie de connexion défini par le site principal et continuer avec (2)?

Je suppose que je vais également avoir besoin d'insérer un enregistrement dans la table des utilisateurs et usermeta.

Alors, est-ce que ce qui précède a du sens - n'ai-je pas pensé à quelque chose. Tout le monde a de bonnes ressources pour aider avec cela (@hakre - j'ai vu que vous avez fait du travail là-dessus !!).

Mise à jour

Donc, je dénonce toujours un peu ma tête contre cela, j'essaie essentiellement de me connecter au filtre d'authentification et de l'utiliser pour:

  1. vérifier si un cookie de connexion pour le site `` maître '' est défini, et s'il l'est, revalider par rapport à leur API d'authentification, et s'il est valide, forcer une connexion WP avec wp_signon(), en utilisant les informations contenues dans le cookie du site maître (email et mot de passe haché) comme informations d'identification pour WP
  2. si le cookie n'est pas défini, redirigez-vous vers la page de connexion du site maître et obtenez une connexion / inscription, puis revenez à l'étape 1
  3. s'il n'y a pas d'utilisateur WP lorsqu'il existe un utilisateur de site maître authentifié, créez-le, puis un code d'accès «transparent» (c'est-à-dire que l'utilisateur ne voit pas de formulaire de connexion WP)

Fondamentalement, je souhaite masquer le formulaire de connexion WP entièrement pour les utilisateurs qui vont simplement commenter, et trouver plus tard un moyen d'autoriser les auteurs et les administrateurs à y accéder directement.

Ça va assez lentement, voici ce que je pourrais utiliser avec de l'aide:

  • le filtre d'authentification est-il le bon à utiliser? Il ne semble pas être appelé dans toutes les situations auxquelles je m'attendrais - par exemple, le méta-widget affiche les liens de connexion / déconnexion sans le déclenchement du crochet d'authentification

  • je peux obtenir wp_signon()pour renvoyer un WP_Userobjet (indiquant le succès), mais cela n'affecte pas le statut connecté - c'est-à-dire que le méta-widget serait toujours affiché dans "Login" même après rafraîchissement.

Toute aide reçue avec gratitude :)


peut-être que cela devrait être une question distincte?
Anu

oh, et je ne sais pas si cela peut même être mentionné, mais je paierais volontiers une demi-journée ou plus d'aide pour cela - les coordonnées de mon profil.
Anu

Réponses:


12

OK, l'approche qui fonctionne pour moi est la suivante:

  1. Supposons que la base de données des utilisateurs du site principal fasse autorité. Le cookie de connexion au site principal contient un identifiant et un hachage du mot de passe du site.

  2. Obtenez le cookie du site principal et revalidez-le contre l'API d'authentification du site principal

  3. Si elle est valide, utilisez l'adresse e-mail de la valeur de retour comme 'user_login'valeur pour WP et le mot de passe du site haché comme mot de passe WP.

  4. Testez si cet utilisateur existe dans WP en utilisant wp_authenticate('user_login', 'user_pass'). Cela renvoie un WP_Userobjet en cas de succès ou un WP_Errorobjet en cas d'échec.

  5. Si WP_Error/is_wp_error(), utilisez alors use wp_update_user()pour créer un utilisateur (ou mettez à jour un utilisateur avec un mot de passe modifié).

  6. Connectez - vous via wp_set_current_user(), wp_set_auth_cookie()etdo_action('wp_login, id)

(Tout cela est contenu dans une fonction attachée à l' 'init'action)

Cela semble fonctionner - des utilisateurs valides du site inconnus de WP sont automatiquement créés. Les changements de mot de passe sont pris en charge, et si le cookie du site est défini et que l'utilisateur WP existe, le SSO est automatique et assez transparent.


1
+1 Description / réponse impressionnante. J'espère que vous trouverez le temps un jour de montrer un peu plus de détails un jour. Nous aiderait les autres à éviter la majeure partie du procès / erro;)
kaiser

1
C'est exactement ce que je cherche, pouvez-vous expliquer un peu plus le processus? Les étapes 1, 2, 3 ne sont pas très claires pour moi. Merci!!
chifliiiii

3

L'ensemble du système d'authentification est enfichable. Je suggère de regarder les plugins existants pour avoir une idée de la façon de remplacer le système. Peut-être en regardant certains plugins LDAP ?


Oui et sans vouloir être snarky, c'est évident !!
Anu

Pour quelques informations qui pourraient aider à refléter le statut de connexion de l'utilisateur, voir ma réponse à cette autre question: wordpress.stackexchange.com/questions/8998/…
Dougal Campbell

1

Plusieurs fonctions liées à l'utilisateur sont définies sous condition !function_exists()dans wp-includes/pluggable.phpet sont faciles à remplacer avec vos propres versions.


1

L'activation de l'authentification unique dans WordPress m'a pris plus de 18 heures de lutte, mais pourrait ne prendre que quelques minutes:

Fondamentalement, vous souhaiterez utiliser https://wordpress.org/plugins/wp-force-login/ et une version modifiée de https://as.wordpress.org/plugins/jwt-authenticator/ , puis créer une authentification sur votre site principal qui génère un JWT (JSON Web Token) et redirige vers l'URL spéciale de votre site WordPress.

Voir le code complet ici .


Merci pour votre réponse. Les réponses aux liens uniquement sont déconseillées car les liens peuvent disparaître et vous rendraient la réponse inutile. Il est préférable d'inclure les bits pertinents ici.
kaiser
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.