CentraleSupélecDépartement informatique
Plateau de Moulon
3 rue Joliot-Curie
F-91192 Gif-sur-Yvette cedex
Le module ''authentication'' et ''deadline''

Le module d'authentification

Le module d'authentification offre deux fonctionnalités :

  • Création de compte. Tout compte est identifié par un nom d'utilisateur et authentifié par un mot de passe.
  • Authentification de l'utilisateur. La vérification des informations d'identification.

Lorsqu'un compte est créé, le nom d'utilisateur et le mot de passe sont stockés dans la table Login dans la base de données de Pistus. Pour des raisons de sécurité, le mot de passe est stocké sous forme hachée, plutôt qu'en texte brut. Dans cette mesure, nous utiliserons un algorithme de hachage qui transforme le mot de passe en une autre chaîne qu'il est virtuellement impossible de retransformer en la chaîne d'origine.

Nous utilisons la bibliothèque Python passlib pour hacher un mot de passe. La documentation est disponible sur cette page.

Création d'un compte

Ouvrez le fichier authentication.py.

Vous devez implémenter deux fonctions :

  • encrypt_password. Elle prend un mot de passe en texte clair et renvoie la version hachée.
  • create_account. Elle crée un compte avec le nom d'utilisateur et le mot de passe spécifiés.


Implémentez les deux fonctions.

👉 Lorsque vous avez terminé, exécutez le fichier authentication.py pour exécuter le code principal. Vous serez invité à saisir un nom d'utilisateur et un mot de passe dans le terminal de Visual Studio Code ; ces informations d'identification seront ensuite transmises à la fonction create_account.

👉 Vérifiez que le nom d'utilisateur et le mot de passe que vous avez saisis apparaissent dans le tableau Login (avec DB Browser for SQLite).


Authentification de l'utilisateur

L'authentification de l'utilisateur se fait en trois étapes :

  • l'utilisateur fournit un nom d'utilisateur et un mot de passe.
  • Le mot de passe est haché avec le même algorithme que celui utilisé pour le chiffrer.
  • Le mot de passe haché est comparé au code hash stocké dans la base de données. Si les deux codes correspondent, l'accès est accordé à l'utilisateur.

L'authentification de l'utilisateur dans PistusResa est mise en œuvre dans la fonction login_correct.

👉 Vous souvenez-vous ? L'implémentation actuelle de la fonction login_correct ne laisse entrer que l'utilisateur admin avec le mot de passe Adm1n!


Remplacez l'implémentation de la fonction login_correct pour vérifier si un nom d'utilisateur et un mot de passe donnés sont corrects. Suivez les instructions dans les commentaires associés à la fonction.

👉 Exécutez le fichier pistus.py et connectez-vous avec le compte que vous avez créé à la question précédente.


Le module Deadline

Le module Deadline est un processus qui s'exécute en arrière-plan dès que l'application PistusResa est ouverte, puis toutes les 24 heures. A chaque exécution, ce module effectue les opérations suivantes :

  • Il récupère les inscriptions impayées.
  • Il identifie les inscriptions expirées (la date d'inscription est à plus de 5 jours de la date actuelle) et les inscriptions tardives (la date d'inscription est à moins de 5 jours de la date actuelle).
  • Il supprime les inscriptions expirées.
  • Il envoie un rappel par email aux étudiants qui ont des inscriptions tardives.


Playground

Apprenons à envoyer des courriels et à lancer des processus en arrière-plan.

Envoi de courriels

Toute application doit communiquer avec un serveur SMTP pour envoyer un courrier électronique.

Le protocole SMTP (Simple Mail Transfer Protocol) est le protocole utilisé par l'application pour communiquer avec le serveur.

Nous avons deux options :

  • Utiliser un serveur SMTP local.
  • Utiliser un serveur SMTP distant.

Nous utiliserons la première option pour l'instant.

Ouvrez un nouveau terminal dans Visual Studio Code et tapez la commande suivante :

python3 -m aiosmtpd -n

Cette commande démarre un serveur SMTP écoutant le port 8025 sur votre ordinateur.

L'exécution de la commande ne produit aucun résultat. Est-ce normal ? Oui, un serveur est une application qui reste en attente de requêtes. Il n'est pas nécessaire d'afficher une quelconque sortie.

Processus en arrière-plan

Laissez le serveur SMTP tranquille et ouvrez le fichier mdeadline_playground.py

Ce fichier utilise deux modules Python :

  • smtplib. Fournit les fonctions permettant de se connecter à un serveur SMTP.
  • email. Fournit les fonctions permettant d'envoyer des courriers électroniques.

Dans la définition de la fonction send_email nous trouvons, entre autres, les instructions suivantes :

  • smtplib.SMTP('localhost', 8025). Connexion au serveur SMTP local. localhost fait référence à votre ordinateur.
  • window.after(5000, send_email). Lance un processus en arrière-plan qui appelle la fonction send_email toutes les 5 secondes.

👉 Lisez les commentaires du fichier pour comprendre toutes les instructions.


Exécutez le fichier mdeadline_playground.py et vérifiez la sortie du serveur SMTP : elle doit contenir le contenu du courrier électronique envoyé par l'application. Vérifiez que l'courriel est envoyé toutes les 5 secondes.

👉 Aucun courriel n'est envoyé en utilisant le serveur SMTP local. Déçu ? Tenez bon, à la fin de cette page, vous découvrirez comment envoyer réellement un email avec Python.

Le module deadline

Le module deadline est implémenté dans le fichier mdeadline.py. Les fonctions suivantes sont déjà implémentées (lisez le code et les commentaires) :

  • deadline. Renvoie la date limite de paiement, compte tenu de la date d'inscription.
  • deadline_expired. Renvoie True si la date limite de paiement est dépassée, compte tenu de la date d'inscription.
  • deadline_aproaching. Renvoie True si la date limite de paiement est dans deux jours à partir de la date actuelle. Cette fonction est utilisée pour identifier les inscriptions tardives, pour lesquelles un rappel par courrier électronique est nécessaire.
  • deadline_management_init. Initialise certaines des variables globales définies dans le fichier. Cette fonction est appelée à la fin de la fonction open_main_window dans le fichier ./gui/mainwindow.py.

Les fonctions suivantes doivent être implémentées :

  • _unpaid_registrations. Elle renvoie toutes les inscriptions non payées.
  • _expired_registrations. Elle renvoie toutes les inscriptions pour lesquelles le délai de paiement a expiré.
  • _late_payment_registrations. Elle renvoie les inscriptions pour lesquelles le délai de paiement est de deux jours à compter de la date actuelle.
  • _remove_expired_registrations. Elle supprime toutes les inscriptions expirées de la base de données.
  • _send_late_payment_reminder. Elle envoie un courrier électronique automatique à tous les étudiants dont l'inscription est en retard.
  • deadline_management. C'est la fonction qui est invoquée périodiquement pour effectuer les opérations du module deadline.

En suivant les instructions écrites dans les commentaires du fichier ./mdeadline.py, implémentez toutes les fonctions.

👉 Récupérez les inscriptions expirées et en retard de la base de données, notez-les quelque part, et seulement ensuite exécutez pistus.py pour vérifier que les courriels de rappel sont envoyés aux bons étudiants et que les inscriptions expirées sont effectivement supprimées.


Serveur SMTP distant

Dans l'activité précédente, nous n'avons pas envoyé de courrier électronique car nous avons utilisé un serveur SMTP local. Si vous souhaitez apprendre à envoyer un courrier électronique en utilisant un serveur SMTP distant, vous pouvez lire les détails dans cette page.