Comprendre la gestion de session et l'authentification des utilisateurs de Drupal

16

J'ai une exigence où, je dois remplacer l'authentification utilisateur par défaut par l'authentification d'un serveur central, c'est-à-dire un serveur SSO.
En déboguant Drupal, j'ai appris que toute la gestion des sessions se faisait en includes/session.incfichier. Je veux faire l'authentification comme indiqué dans l'image:

casser

SCÉNARIO: Connexion
Les détails des étapes seraient:

  1. Remplacez le formulaire de connexion pour soumettre le nom d'utilisateur et le mot de passe au serveur SSO ( pas sur Drupal , mais sur .NET).
  2. Authentifier l'utilisateur sur le serveur SSO en utilisant la base de données de ce site; et envoyer une réponse à une page PHP personnalisée de mon site Web (ou un formulaire par un module?).
  3. À l'aide de la réponse, identifiez l'utilisateur dans le tableau des utilisateurs et créez une session pour cet utilisateur sans vérifier le mot de passe (car cela signifierait une double authentification). Par défaut, Drupal définit un cookie avec un nom de $insecure_session_namevariable et une valeur $sid. Je veux que Drupal ne place pas le cookie ici, envoie plutôt les valeurs des variables au serveur SSO.
  4. Le serveur SSO prendra les valeurs, créera un cookie et le déposera dans le domaine principal domain.com(pour rappeler les deux my websiteet se sso servertrouve sur le sous-domaine du domaine principal, qui n'est pas non plus dans Drupal). Ensuite, le site drupal peut se connecter en utilisant ce cookie.

Je sais que c'est une question difficile, je cherche juste des conseils sur la façon de commencer? comme ils disent "vous ne devriez pas pirater le noyau". Donc, mes questions sont:

  1. Où dois-je chercher pour comprendre comment l'authentification Drupal et la gestion de session fonctionnent en profondeur?
  2. Existe-t-il un moyen d'appeler les fonctions en includes/session.incutilisant des hooks (comme le dit le commentaire avec les fonctions "pour usage interne uniquement / à ne pas modifier")?

REMARQUE: je vais utiliser la même méthode pour enregistrer l'utilisateur, afin que l'enregistrement reste dans la base de données centrale du serveur SSO. Et pendant cela, un mot de passe indésirable sera inséré pour le même utilisateur dans la base de données du site Drupal (car le mot de passe ne sera pas vérifié lors de la connexion).

AjitS
la source
Avez-vous besoin d'une véritable authentification unique (vous connecter à un site et vous êtes connecté à tous les sites), ou simplement vous authentifier auprès d'un système extérieur?
mpdonadio
@MPD Je veux un vrai SSO, qui nécessitera la connexion sur un site et -> l'authentification du même utilisateur sur tous les sites (peut-être pas sur Drupal.
AjitS
@AjitS si vous avez réussi à implémenter cela, veuillez mettre une réponse détaillée. J'utilise user_login_finalize mais on me dit qu'en raison de problèmes avec le RGPD, je ne peux pas stocker les détails dans Drupal.
Jignesh Rawal

Réponses:

17

Drupal prend en charge l'authentification externe . Il existe de nombreux modules d'authentification alternatifs pour Drupal, tels que OpenID (inclus dans le noyau), OAuth Connector ou LDAP . En savoir plus sur le fonctionnement de l'authentification Drupal; le mieux serait de regarder les modules OpenID et OAuth, et de renvoyer le formulaire de connexion principal. Mais, AFAIK, ils démarrent toujours la session Drupal normale après une authentification réussie.

Pour la gestion des sessions, Drupal se connecte à la gestion des sessions PHP et enregistre ses propres gestionnaires. Le backend de session Drupal est lui-même enfichable, vous pouvez définir la session_incvariable sur le chemin d'un fichier fournissant des implémentations alternatives des fonctions trouvées dans includes/session.inc. Le module memcache l' utilise pour stocker la session dans memcached.

Pour les références, le module OpenID gère l'authentification réussie dans openid_authentication()laquelle lui-même fonctionne et appelle le gestionnaire de soumission du formulaire de connexion utilisateur (c'est-à-dire. user_login_submit()). Ce gestionnaire de soumission lui-même est simple, il charge l'utilisateur authentifié avec succès user_load()dans la $uservariable globale , il appelle ensuite la user_login_finalize()session de gestion, l'horodatage de connexion dans la usertable et l'invocation des hook_user_login()implémentations.

Une autre option est d'utiliser la user_external_login_register()fonction. La fonction connecte un utilisateur externe. Elle crée également un utilisateur local si nécessaire. Si vous avez besoin d'un plus grand contrôle sur la création d'utilisateur local, vous pouvez toujours utiliser user_save(), user_set_authmaps(), user_login_submit()et user_external_load()de vous appeler sur mesure, en utilisant user_external_login_register()comme modèle de ce qui doit être fait.

Pierre Buyle
la source
2
C'est à peu près sur place. Le côté Drupal de la connexion d'utilisateurs externes est étonnamment simple. Le levage de charges lourdes (le cas échéant) est en fait en interface avec le système externe.
mpdonadio
@MPD Trouver le contraire, dans mon cas particulier. Système externe = service Web JSON = choses relativement faciles. Comportement Drupal = passage imprévisible d'une version à une autre version = difficile comme l'enfer et aucun diagnostic utile lorsque les choses se cassent.
Trejkaz
1

user_authenticate () APi pourrait être utile ici.

3.À l'aide de la réponse, identifiez l'utilisateur dans le tableau des utilisateurs et créez une session pour cet utilisateur sans vérifier le mot de passe (car cela signifierait une double authentification). Par défaut, Drupal définit un cookie avec un nom de $insecure_session_namevariable et une valeur $sid. Je veux que Drupal ne place pas le cookie ici, envoie plutôt les valeurs des variables au serveur SSO.

EDIT: Une fois que le serveur SSO revient avec vrai, utilisez cette API pour vous connecter à l'utilisateur qui s'occupera automatiquement des sessions pour vous. Je pense que c'est mieux si vous utilisez user_authenticate()au lieu de créer des sessions par vous-même. Cela ne devrait pas poser de problème, même si c'est une double authentification tant que p-assowrd valide est fourni.

Je ne suis pas sûr de 4. Voulez-vous que le cookie soit visible dans les deux domaines? Si c'est le cas, dans settings.php, initialisez $cookie_domainle domaine. Ensuite, les cookies du sous-site seront disponibles sur le site parent.

GoodSp33d
la source
Merci pour votre réponse. Je ne peux pas utiliser user_authenticatecar, l'authentification n'a pas besoin de se produire sur le site Drupal. Je peux générer la session en appelant drupal_session_generate()et à drupal_session_regenerate()partir du fichier session.inc. Vous avez bien compris l'exigence de cookie .. veuillez consulter la modification.
AjitS
@indrock Vérifiez ce lien. User_authenticate vous permettra de vous connecter un nom d'utilisateur et un mot de passe fournis par l'utilisateur sont corrects. À l'étape 3, lorsque vous vérifiez que le nom d'utilisateur et la passe sont corrects sur le serveur SSO, utilisez cette API pour vous connecter à l'utilisateur. Mais vous devriez avoir un mot de passe stocké sur Drupal. Faire cela le rendra beaucoup plus facile que le piratage du noyau.
GoodSp33d