Méthodes d'authentification
Vue d'ensemble du processus d'authentification de Moodle
Le cas d'usage qui passe par l'authentification d'un utilisateur Moodle commence lorsque ce dernier clique sur le lien "connexion" sur l'interface utilisateur. La procédure suivante est ensuite déroulée (à l'exception de quelques détails mineurs ou de scénarios plus rares) :
- Dans le cas général, la page de présentation de login "par défaut", /login/index.php est produite. Celle-ci demande le "vecteur d'identité" de l'utilisateur. Si l'administrateur technique de Moodle a défini explicitement une page alternative de login dans les paramètres généraux d'authentification du menu Administration, l'utilisateur est directement rerouté sur cette page.
- L'utilisateur entre ses données d'identification.
- Le code de la page /login/index.php est exécuté :
- La liste des plugins d'authentification actifs est obtenue.
- La fonction loginpage_hook() est exécutée sur chaque plugin, permettant à chacun d'entre eux de capturer la demande d'authentification.
- Une vérification est faite pour s'assurer que l'identifiant remplit les critères de Moodle (alphanumerique, autorisant les points, tirets et arobaces).
- La fonction authenticate_user_login() de /lib/moodlelib.php est appelée, laquelle renvoie un objet $user. (Des détails sur la procédure suivent.)
- L'objet $user est testé pour vérifier si l'authentification/identification est correcte (l'objet $user doit être valide) et, dans la négative, renvoie l'utilisateur à la page d'entrée avec un message d'erreur. Autrement (authentification réussie), elle détermine l'endroit où l'utilisateur désirait aller à l'origine (avant l'authentification) et l'y conduit, à moins qu'une situation particulière ne soit détectée, comme par exemple la nécessité de changer le mot de passe (première connexion).
Voici le scénario général, mais l'exécution de la fonction authenticate_user_login() passe par un certain nombre d'étapes qui peuvent avoir un certain intérêt :
- Elle récupère la liste des plugins actifs.
- Elle recherche l'identifiant dans le champ "username" de la table mdl_user pour vérifier l'existence d'un compte à ce "nom", et récupère le mode d'authentification (et donc l'identité du plugin qui la gère, notamment au moment de la première connexion).
- Elle crée un objet $user, qui contient les données trouvées dans l'enregistrement correspondant de la table mdl_user si l'identifiant est connu ; Si ce dernier n'est pas trouvé, l'objet sera vide.
- Sur la base du plugin d'authentification identifié pour cet utilisateur, (notez que si l'utilisateur n'est pas connu dans la table locale, Moodle essayera les étapes suivantes avec tous les plugins actifs et dans l'ordre de la pile, jusqu'à ce qu'une réponse positive soit obtenue, ou que tous les plugins possibles aient été testés) :
- Elle appelle la méthode user_login() proposée par le plugin, qui renvoie un booléen indiquant que l'authentification est réussie ou non. Si le résultat est négatif, (pas d'authentification), elle saute ce qui suit et essaie le plugin suivant.
- Si le plugin authentifie l'utilisateur par le biais d'une requête externe (tout sauf à partir de la base de données de Moodle), la méthode update_user_record() est appelée pour récupérer toutes les données utiles possible sur l'utilisateur (son nom, ses informations de contact, etc.)
- Elle crée l'enregistrement d'utilisateur Moodle s'il n'existe pas déjà.
- Elle appelle la méthode sync_roles() du plugin permettant d'appliquer une politique particulière d'attribution de rôles si les informations suffisantes sont disponibles.
- Notifie tous les plugins actifs que l'utilisateur a bien été authentifié, en appelant la méthode user_authenticated_hook() sur chacun d'eux.
- Si tout s'est bien passé, l'objet $user est retourné. Dans le cas contraire un objet null (false) est retourné.
Créer et activer un plugin d'authentification
Pour créer et activer un plugin d'authentification, procédez de la manière suivante :
- Choisissez un nom pour votre plugin. Nous utiliserons le nom 'sentry' dans l'exemple qui suit ; vous changerez ce nom par le nom de votre propre plugin partout où c'est nécessaire.
- Dans la racine de votre installation Moodle, créez un répertoire /auth/sentry. Ce répertoire devrait être au même niveau que ceux des autres plugins déjà existants : 'db', 'nologin', 'none', etc.
- Créez le fichier /auth/sentry/auth.php. Dans ce fichier, créez la classe class auth_plugin_sentry qui étend la classe de base des plugins d'authentification auth_plugin_base située dans le fichier /lib/authlib.php. (vous devez requérir la librairie centrale lib/authlib.php.)
- Implémentez la fonction user_login() dans votre fichier auth.php file, et créez les méthodes additionnelles nécessaires. Vous surchargerez certaines des méthodes déjà fournies par la classe de base pour obtenir le comportement souhaité.
- Connectez vous à votre Moodle en tant qu'administrateur, et cherchez le menu "Utilisateurs -> Authentification -> Gérer l'authentification" dans le bloc d'administration de site. Vous devez voir votre plugin apparaître dans la liste des plugins, sous la forme [[auth_sentrytitle]]. Vous pouvez alors l'activer et le monter ou le descendre dans la pile d'authentification. A ce moment, et dès l'activation du plugin, ce dernier est enregistré dans Moodle et est utilisé dans le processus d'authentification.'
- Pour finir le "packaging" de votre module et pour remplacer le nom non localisé [[auth_sentrytitle]] de votre plugin dans l'interface utilisateur de Moodle, vous devrez créer un fichier de chaînes de caractères (fichiers de localisation). Créez alors le répertoire /auth/sentry/lang, et à l'intérieur, un sous-répertoire pour chaque langue que vous voulez voir supportée. (Exemple : /auth/sentry/lang/en_utf8 et /auth/sentry/lang/fr_utf8) Notez que si vous voulez publier votre plugin, la langue anglaise "en_utf8" est une exigence minimale. Pour chaque langage, créez le fichier auth_sentry.php. Ce fichier devra donner la traduction de la chaîne $string['auth_sentrytitle'] pour ce langage. Vous pouvez aussi définir une description statique de ce plugin en fournissant un texte pour l'entrée $string['auth_sentrydescription'] ; vous rajouterez toutes les entrées que votre plugin utilise dans tous ses fichiers de code, en prenant soin d'appeler les traductions dans le domaine get_string('xxxx', 'auth_sentry').
- Si votre plugin d'authentification a besoin de réglages qui doivent âtre effectués par un administrateur, implémentez les méthodes config_form() et process_config() de la classe d'authentification. Vous pouvez utiliser l'exemple du plugin 'db' comme modèle de base. Les réglages du plugin pourront alors être effectués à travers l'interface d'administration de Moodle dans la page de "paramètres" de ce plugin accessible à partir de la liste d'administration des plugins d'authentification. Les paramètres enregistrés sont stockés dans la table mdl_config_pluginstable du modèle de données de Moodle.
Voir aussi
- Le forum Overview of entire authentication code flow (en anglais) contient un grand nombre de discussions à propos de l'authentification.