Fermer

novembre 14, 2023

Comment effectuer l’authentification utilisateur avec Flask-Login –

Comment effectuer l’authentification utilisateur avec Flask-Login –


Dans cet article, nous examinerons les différentes fonctionnalités offertes par Flask-Login et comment les utiliser pour créer une fonctionnalité de connexion utilisateur sécurisée pour votre application Web. À la fin de cet article, vous comprendrez bien comment utiliser Flask-Login pour implémenter l’authentification sécurisée des utilisateurs dans vos applications Flask.

L’authentification est un élément important de toute application Web qui permet aux utilisateurs d’accéder à des données ou à des ressources, car elle garantit que seules les bonnes personnes ont accès aux informations sensibles. Cela peut également être réalisé dans Flask en utilisant Flask-Login.

Connexion Flask est une extension de Flask avec des fonctions qui gèrent la connexion et la déconnexion des utilisateurs et assurent le suivi du ou des utilisateurs actuels tout au long de l’application. Cela facilite la mise en œuvre de l’authentification et de l’autorisation dans vos applications Flask.

Table des matières

Pourquoi utiliser Flask-Login ?

Flask-Login possède un certain nombre de fonctionnalités et de fonctions qui facilitent l’authentification de manière transparente dans les applications Flask. Voici quelques-uns des avantages de l’utilisation de Flask-Login :

  • Gestion des sessions utilisateurs. Flask-Login gère la création et la destruction des sessions utilisateur. Il peut également stocker l’ID de l’utilisateur actuel dans la session afin que vous puissiez facilement vérifier si un utilisateur est connecté.

  • Fonctionnalité de connexion et de déconnexion. Flask-Login fournit des fonctions de connexion et de déconnexion intégrées. Ces fonctions prennent en charge tous les processus importants, tels que la création et la destruction de sessions et la redirection de l’utilisateur vers la page appropriée.

  • Rappel du chargeur utilisateur. Flask-Login vous permet de définir un rappel du chargeur utilisateur. Ce rappel est utilisé pour charger l’objet utilisateur pour la session en cours. Ceci est utile si vous utilisez une base de données pour stocker les informations utilisateur.

  • Authentification et autorisation. Flask-Login facilite la mise en œuvre de l’authentification et de l’autorisation dans vos applications. Vous pouvez utiliser Flask-Login pour protéger des pages ou des itinéraires spécifiques et pour accorder aux utilisateurs différents niveaux d’accès à votre application.

Conditions préalables

Pour suivre longtemps cet article, vous avez besoin des éléments suivants :

  • une connaissance de la syntaxe Python et Flask
  • une connaissance de base de HTML et CSS
  • Python version 3 et Flask installés

Évidemment, vous devez également accéder à un navigateur Web.

Commencer

Pour utiliser pleinement le module de connexion Flask, nous devons installer Flask-Login et d’autres dépendances nécessaires. Ces bibliothèques fournissent les fonctions et outils nécessaires pour améliorer les fonctionnalités de votre application. Pour les installer, ouvrez votre invite de commande ou votre terminal et exécutez la commande pip suivante :

pip install flask-login flask_sqlalchemy flask_bcrypt

Voici un aperçu de l’utilisation de chacune de ces bibliothèques :

  • Flask-SQLAlchimie: intègre SQLAlchemy à Flask pour les opérations de base de données
  • Flacon-Bcrypt: ajoute le hachage Bcrypt pour la sécurité des mots de passe dans Flask

Une fois l’installation terminée, la connexion Flask sera automatiquement téléchargée dans le répertoire que vous avez utilisé.

Remarque : au moment de la rédaction, il y a un léger problème dans la résolution des dépendances dans la dernière version de Flask et Werkzeug. Pour résoudre ce problème, vous devez forcer l’installation de la version 2.3.0 de Werkzeug, car c’est la seule version connue qui fonctionne actuellement.

Une fois vos dépendances installées, vous devrez les initialiser avec votre application Flask :

from flask_sqlalchemy import SQLAlchemy

from flask_login import UserMixin, LoginManager, login_user, logout_user, login_required

from flask_bcrypt import Bcrypt

from flask_login import LoginManager
 app = Flask(__name__)

login_manager = LoginManager()

login_manager.init_app(app)  

Dans l’extrait de code ci-dessus, nous avons également initialisé le LoginManager objet dans notre application. LoginManager est une extension de Flask-Login utilisée pour configurer les configurations nécessaires à la gestion des sessions utilisateur.

Création d’un modèle utilisateur

UN modèle est une représentation de la structure de données que vous souhaitez utiliser dans votre application. Il définit la manière dont les données sont organisées, stockées et manipulées au sein du système. Les modèles sont généralement utilisés avec une base de données qui suit la structure définie au préalable. Pour notre application, nous disposons des données suivantes :

  • un identifiant unique
  • un nom d’utilisateur
  • un mot de passe (haché)
class User(UserMixin):

id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True)
password_hash = db.Column(db.String(128))

def __repr__(self):
  return f'<User {self.username}>'

Vous pouvez également ajouter des propriétés supplémentaires à votre modèle utilisateur, telles qu’une adresse e-mail ou une photo de profil, en fonction de la portée de votre projet.

Création d’une base de données

Une fois que vous avez défini votre modèle utilisateur, vous devez créer une base de données qui stockera la structure de données que nous avons créée dans le modèle précédent.

Pour cet article, nous utiliserons une base de données SQLite. En effet, SQLite est un moteur de base de données léger et sans serveur. Cela le rend facile à configurer et à utiliser, car il ne nécessite pas d’installation séparée. C’est également un bon choix pour les applications de petite et moyenne taille.

Voici un aperçu des étapes d’utilisation d’une base de données SQLite dans notre application :

  1. Pour utiliser la base de données SQLite, vous devez définir un URI dans la configuration de votre application Flask. Cela se fait généralement en haut, aux côtés d’autres configurations. Voici un extrait que vous pouvez utiliser :

    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' 

    Dans cet extrait, le ///... indique le chemin relatif de votre fichier — site.db – qui est le nom que nous avons utilisé pour notre fichier de base de données SQLite. Ce nom peut être modifié comme vous le souhaitez.

  2. Ensuite, vous devez initialiser l’ORM Flask-SQLAlchemy à l’aide de cet extrait :

    SQLAlchemy est un mappeur objet-relationnel qui fournit un ensemble d’outils pour travailler avec des bases de données à l’aide de Python. La ligne db = SQLAlchemy(app) crée une instance de la classe SQLAlchemy et la lie à votre application Flask (app).

  3. Pour créer cette base de données, nous devons initialiser la base de données, en utilisant le create_all méthode:

    if __name__ == '__main__':
    
    db.create_all()
    
    app.run(debug=True)

    Ce code est généralement placé à la fin de votre script Python ou dans un script distinct dédié à l’initialisation de la base de données. Une fois votre script exécuté, le fichier de base de données sera créé avec les tables correspondantes basées sur les modèles que nous avons définis précédemment.

    Dans ce cas, le code créera un site.db fichier avec un User table si elle n’existe pas déjà. Le site.db le fichier se trouve généralement dans un dossier appelé /instance/.

    La structure des fichiers de notre application

Ensuite, nous devons créer un user_loader qui prend un identifiant utilisateur et renvoie le correspondant User objet. Voici un exemple :

@login_manager.user_loader
def load_user(user_id):
  return User.query.get(user_id)

Hachage de mot de passe

Hachage de mot de passe est une mesure de sécurité qui stocke la représentation cryptographique du mot de passe de l’utilisateur avant qu’il ne soit stocké dans une base de données. De cette façon, il devient plus difficile d’obtenir le mot de passe réel même lorsque la sécurité de l’application a été compromise.

Habituellement, le mot de passe est d’abord haché lors du processus d’inscription et stocké dans une base de données. Ensuite, chaque fois qu’un utilisateur se connecte, son mot de passe est à nouveau haché et comparé au mot de passe haché stocké dans la base de données. Si les deux mots de passe correspondent, l’utilisateur est authentifié et a accès à l’application.

Comment hacher et vérifier les mots de passe à l’aide de Flask-Bcrypt

Flask possède une extension appelée Flask-Bcrypt qui permet d’obtenir cette fonctionnalité. Il a deux fonctions principales : generate_password_hash() et check_password_hash().

Legenerate_password_hash() La fonction prend le mot de passe de l’utilisateur comme argument et renvoie un mot de passe haché. Ceci est généralement utilisé dans la logique d’enregistrement.

Le check_password_hash() la fonction prend un mot de passe et un mot de passe haché comme arguments et renvoie true si les deux mots de passe correspondent, ou false s’ils ne correspondent pas. Ceci est appelé avant d’accorder l’accès à la vue de connexion

Création d’une vue de registre

Vues font partie du framework Flask utilisé pour générer du HTML, JSON ou d’autres données envoyées au navigateur de l’utilisateur. Dans cet extrait de code, nous allons créer une vue qui accepte la saisie de l’utilisateur et ajoute les détails à la base de données :

@app.route('/register', methods=['GET', 'POST'])

def  register():

if request.method == 'POST':
  username = request.form['username']
  password = request.form['password']
  hashed_password = bcrypt.generate_password_hash(password).decode('utf-8')

  new_user = User(username=username,password=hashed_password) 
    db.session.add(new_user)
    db.session.commit()
    return redirect(url_for('welcome '))
  return render_template('registeration.html')

Voici une ventilation du code :

  • Dans la première ligne, nous définissons une route pour le chemin de l’URL /login. Cette route accepte les requêtes GET et POST. Le login() La fonction, associée à l’itinéraire, sera exécutée lorsqu’une demande est faite.

  • Ensuite, nous confirmons si la méthode de requête est une méthode POST :

    if request.method == 'POST':

    Une fois confirmée, la fonction récupère les valeurs saisies par l’utilisateur dans le formulaire de connexion :

    username = request.form['username']
    password = request.form['password']
  • Il interroge ensuite la base de données pour un utilisateur avec le nom d’utilisateur fourni. Si un utilisateur avec le nom d’utilisateur fourni est trouvé et que le mot de passe correspond, le code contenu dans ce bloc sera exécuté.

Création d’une vue de connexion

Dans la vue de connexion, nous créons une logique qui accepte les entrées d’une page, puis vérifions si l’entrée correspond à une ligne de la base de données :

@app.route('/login', methods=['GET', 'POST'])

def  login():
  if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']
    user = User.query.filter_by(username=username).first()

    if user and bcrypt.check_password_hash(user.password, password):
    login_user(user)
      return redirect(url_for('welcome'))
  return render_template('login.html')

Voici un aperçu du fonctionnement du code :

  • Dans la première ligne – @app.route('/login', methods=['GET', 'POST']): — nous utilisons un décorateur qui définit une route pour le chemin de l’URL /login. La route accepte les requêtes GET et POST. La fonction associée, login()sera exécuté lorsqu’une requête est faite sur cette route.

  • Le login() La fonction commence par vérifier si la méthode de requête est POST :

    if request.method == 'POST':

    Une fois confirmé qu’il s’agit d’une requête POST, il récupère les valeurs saisies par l’utilisateur dans le formulaire de connexion :

    username = request.form['username']
    password = request.form['password']
  • Il interroge ensuite la base de données pour un utilisateur avec le nom d’utilisateur fourni :

    user = User.query.filter_by(username=username).first()
    if user and bcrypt.check_password_hash(user.password, password):  
  • Si le nom d’utilisateur et le mot de passe sont validés, l’utilisateur obtient l’accès à l’aide de Flask-Login. login_user et redirect les fonctions:

    login_user(user)
    redirect(url_for('welcome'))
  • Cependant, si le request La méthode n’est pas POST ou les détails sont incorrects, elle restitue le login.html modèle:

    return render_template('login.html')

    Essentiellement, il vérifie si les informations d’identification saisies sont valides, connecte l’utilisateur et le redirige vers la page d’accueil en cas de succès. Si la connexion échoue ou s’il s’agit d’une requête GET, le modèle de connexion est affiché pour que l’utilisateur puisse saisir ses informations d’identification.

Création d’une logique de déconnexion à l’aide d’une vue protégée

Dans la plupart des applications, certaines pages sont inaccessibles si l’utilisateur n’est pas connecté. Cela inclut des pages telles que l’historique des transactions, les brouillons et les pages de déconnexion. Flask-Login fournit un moyen pratique de protéger ces pages/itinéraires et de restreindre l’accès aux utilisateurs authentifiés à l’aide du login_required décorateur. Voici un aperçu de son fonctionnement.

Pour utiliser cette fonctionnalité, vous devez importer le login_required décorateur de Flask-Login :

from flask_login import login_required

Ensuite, vous devez ajouter le login_required décorateur à tout itinéraire que vous souhaitez protéger. Par exemple, créons une page de déconnexion accessible uniquement lorsque l’utilisateur est connecté :

@app.route('/logout')
  @login_required
  def  logout():
    logout_user()
    return redirect(url_for('login'))

Voici un aperçu de son fonctionnement :

  • Tout comme dans la vue de connexion, @app.route('/logout') définit un itinéraire pour le chemin de l’URL /logout.

  • Ensuite, nous ajoutons un login_required décorateur qui garantit que l’utilisateur doit être connecté pour accéder au logout itinéraire. Si un utilisateur n’est pas connecté et tente d’accéder à cet itinéraire, il sera redirigé vers la page de connexion.

  • À l’intérieur de logout fonction, logout_user() est appelé. Cette fonction est fournie par Flask-Login et est utilisée pour déconnecter l’utilisateur actuel.

  • Après avoir déconnecté l’utilisateur, la fonction le redirige vers le login itinéraire utilisant redirect(url_for('login')).

Ainsi, lorsqu’un utilisateur accède au /logout route, Flask-Login garantit qu’ils sont connectés (@login_required), les déconnecte et les redirige vers la page de connexion. Cela permet de gérer en toute sécurité la déconnexion des utilisateurs dans votre application Flask. Le login_required décorateur est appliqué à la /protected route, indiquant que seuls les utilisateurs authentifiés peuvent y accéder. Et si un utilisateur tente d’accéder à une page protégée sans être connecté, Flask-Login le redirigera vers la page de connexion.

Ajout de modèles

Modèles dans Flask vous permet d’utiliser des pages HTML pour définir l’apparence de votre site. Pour mettre pleinement en œuvre la logique dans notre app.py fichier, nous allons créer les pages HTML illustrées ci-dessous.

La structure des fichiers de notre application

L’animation ci-dessous montre comment les modèles restituent les différentes pages de notre site.

Vous pouvez voir le code complet de ce didacticiel et en savoir plus sur son implémentation dans cet article Dépôt GitHub.

Comment Flask-Login gère les sessions utilisateur avec les cookies de session utilisateur

UN session utilisateur est un système utilisé pour suivre et mettre à jour les informations de l’utilisateur pendant que l’utilisateur est connecté. Flask-Login gère ces sessions en stockant un cookie de session sur le navigateur de l’utilisateur. Le cookie de session est un petit élément de données qui contient un identifiant unique pour la session de l’utilisateur.

Lorsqu’un utilisateur se connecte à un site Web à l’aide de Flask-Login, le serveur génère un cookie de session et l’envoie au navigateur de l’utilisateur. Le navigateur stocke le cookie de session et l’inclut dans toutes les requêtes adressées au serveur. Le serveur utilise le cookie de session pour identifier l’utilisateur et son état de session.

Par exemple, si l’utilisateur est connecté et visite une page protégée par Flask-Login, Flask-Login vérifiera le cookie de session pour voir si l’utilisateur est authentifié. Si l’utilisateur est authentifié, Flask-Login chargera les informations de profil de l’utilisateur à partir de la base de données et les rendra disponibles à la vue. Si l’utilisateur n’est pas authentifié, Flask-Login redirigera l’utilisateur vers la page de connexion.

Lorsque l’utilisateur se déconnecte du site Web, le serveur supprime le cookie de session du navigateur de l’utilisateur, ce qui met fin à la session utilisateur.

Conclusion

Flask offre une variété de fonctions qui abordent différents aspects de l’authentification, allant de la gestion des sessions utilisateur à l’autorisation. En utilisant ces fonctions, vous pouvez mettre en œuvre un système d’authentification robuste et sécurisé adapté aux besoins spécifiques de votre application.






Source link

novembre 14, 2023