web-dev-qa-db-fra.com

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

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

Ce système agira comme une base de données d'utilisateurs faisant autorité et fournira une interface RESTful pour créer de nouveaux utilisateurs et authentifier les utilisateurs valides.

  1. Je dois pouvoir créer de nouveaux utilisateurs dans WP et, dans le cadre de ce processus, appeler l'API d'authentification externe pour créer/valider cet utilisateur.

  2. Une personne qui est un utilisateur valide, mais que WP ne connaît pas, devrait pouvoir se connecter pour commenter, sans avoir besoin de s'inscrire sur le site WP.

  3. Une personne connectée à l'ensemble du site Web doit également être automatiquement connectée à WordPress.

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

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

  • Pour (2) - je suppose que je raccroche le filtre d'authentification - c'est-à-dire que lorsque quelqu'un essaie de se connecter, je le piège, passe un appel au système externe, puis traite l'identifiant WP ou le redirige au processus d’enregistrement où (1) prend l’ordre.

  • Pour (3) - lisez le cookie de connexion défini par le site principal et passez à (2)?

Je suppose que je devrai également insérer un enregistrement dans la table users et usermeta.

Donc, ce qui précède a-t-il un sens - n'ai-je pas pensé à quelque chose? N'importe qui a de bonnes ressources pour aider avec ça (@hakre - j'ai vu que vous aviez fait du travail là-dessus !!).

Mettre à jour

Donc, je cogne encore un peu la tête contre cela, essentiellement, j'essaie 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, le cas échéant, revalider par rapport à leur API d'authentification et, le cas échéant, forcer une connexion WP avec wp_signon(), à l'aide des informations contenues dans le site principal cookie (adresse électronique et mot de passe haché) en tant qu'informations d'identification pour WP
  2. si le cookie n'est pas défini, redirigez-le vers la page de connexion du site principal et obtenez un identifiant/une connexion, 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 indiquez un code d'accès "transparent" (pour que l'utilisateur ne voie pas un identifiant WP forme)

En gros, je veux cacher le formulaire de connexion WP entièrement aux utilisateurs qui vont simplement commenter, et plus tard, trouver un moyen d'autoriser les auteurs et l'administrateur à y accéder directement.

Cela va assez lentement, voici ce que je pourrais utiliser une aide avec:

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

  • je peux obtenir que wp_signon() renvoie un objet WP_User (indiquant le succès), mais cela n’affecte pas l’état de la connexion; c’est-à-dire que le widget méta serait toujours affiché "Connexion", même après actualisation.

Toute aide reçue avec gratitude :)

15
anu

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

  1. Supposons que la base de données d'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. Récupérez le cookie sur le site principal et revalidez-le par rapport à l'API d'authentification du site principal.

  3. S'il est valide, utilisez l'adresse électronique de la valeur renvoyée en tant que valeur 'user_login' pour WP et le mot de passe de site haché en tant que mot de passe WP.

  4. Testez si cet utilisateur existe dans WP à l'aide de wp_authenticate('user_login', 'user_pass'). Cela retourne un objet WP_User en cas de succès, ou un objet WP_Error en cas d'échec.

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

  6. Connexion via wp_set_current_user(), wp_set_auth_cookie() et do_action('wp_login, id)

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

Cela semble fonctionner: des utilisateurs de site valides inconnus de WP sont automatiquement créés. Les modifications de mot de passe sont prises en compte et si le cookie de site est défini et que l'utilisateur WP existe, le SSO est automatique et relativement transparent.

12
anu

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 quelques plugins LDAP ?

3
Dougal Campbell

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

En gros, vous voudrez utiliser https://wordpress.org/plugins/wp-force-login/ et une version modifiée de https://as.wordpress.org/plugins/jwt-authenticator/ puis créez un point de terminaison protégé par une autorisation sur votre site principal, qui génère un JWT (jeton Web JSON) et redirige vers l'URL spéciale de votre site WordPress.

Voir code complet ici .

1
Ryan

Plusieurs fonctions liées à l'utilisateur sont définies conditionnellement sur !function_exists() dans wp-includes/pluggable.php et sont faciles à remplacer par vos propres versions.

1
Rarst