44from flask_jwt_extended import (JWTManager , create_access_token , jwt_required , get_jwt_identity )
55import datetime
66
7+ # Initialiser l'application Flask
78app = Flask (__name__ )
89
9- # Clé secrète pour signer les tokens JWT
10- app .config ['JWT_SECRET_KEY' ] = 'votre_clé_secrète ' # La clé secrète pour signer le JWT
11- jwt = JWTManager (app ) # Initialisation de JWTManager
10+ # Configurer la clé secrète pour signer les tokens JWT
11+ app .config ['JWT_SECRET_KEY' ] = 'supersecretkey ' # Utilisez une clé secrète robuste en production
12+ jwt = JWTManager (app )
1213
14+ # Initialiser l'authentification de base
1315auth = HTTPBasicAuth ()
1416
1517# Liste des utilisateurs avec mots de passe hashés et rôles
1618users = {
17- "john" : {
18- "password" : generate_password_hash ("hello" ),
19- "role" : "user"
20- },
21- "admin" : {
22- "password" : generate_password_hash ("admin123" ),
23- "role" : "admin"
24- }
19+ "user1" : {"username" : "user1" , "password" : generate_password_hash ("password" ), "role" : "user" },
20+ "admin1" : {"username" : "admin1" , "password" : generate_password_hash ("password" ), "role" : "admin" }
2521}
2622
2723# Vérification du mot de passe avec Basic Auth
2824@auth .verify_password
2925def verify_password (username , password ):
3026 if username in users and check_password_hash (users [username ]["password" ], password ):
31- return username # Retourne l'utilisateur authentifié
32-
33- # Route protégée avec Basic Auth
34- @app .route ('/protected_basic' , methods = ["GET" ])
35- @auth .login_required # Protégé avec Basic Auth
36- def protected_basic ():
37- return jsonify ({"message" : f"Bienvenue, { auth .current_user ()} avec Basic Auth !" })
38-
39- # Route publique (sans authentification)
40- @app .route ('/' )
41- def home ():
42- return jsonify ({"message" : "Bienvenue sur l'API !" })
27+ return username # Authentification réussie
4328
4429# Fonction pour créer un token JWT
4530def create_jwt_token (username ):
46- expiration = datetime .datetime .utcnow () + datetime .timedelta (hours = 1 ) # Le jeton expire après 1 heure
47- role = users [username ][ "role" ]
31+ expiration = datetime .datetime .utcnow () + datetime .timedelta (hours = 1 ) # Le token expire après 1 heure
32+ user_data = users [username ]
4833 payload = {
4934 'sub' : username ,
50- 'exp ' : expiration ,
51- 'role ' : role # Ajoute le rôle de l'utilisateur dans le payload
35+ 'role ' : user_data [ "role" ], # Ajout du rôle dans le payload du JWT
36+ 'exp ' : expiration
5237 }
53- token = create_access_token (identity = username , additional_claims = {' role' : role }) # Créer un token avec le rôle
38+ token = create_access_token (identity = username , additional_claims = {" role" : user_data [ " role" ] }) # Création du JWT
5439 return token
5540
41+ # Route pour accéder à une ressource protégée avec l'authentification de base
42+ @app .route ('/basic-protected' , methods = ["GET" ])
43+ @auth .login_required # Protéger avec l'authentification de base
44+ def basic_protected ():
45+ return jsonify ({"message" : "Basic Auth: Access Granted" })
46+
47+ # Route publique (sans authentification)
48+ @app .route ('/' )
49+ def home ():
50+ return jsonify ({"message" : "Bienvenue sur l'API !" })
51+
5652# Route pour se connecter et obtenir un JWT
5753@app .route ('/login' , methods = ["POST" ])
5854def login ():
59- # Récupérer les identifiants dans la requête
6055 username = request .json .get ("username" )
6156 password = request .json .get ("password" )
62-
63- # Vérifier les identifiants
57+
58+ # Vérification des identifiants
6459 if username in users and check_password_hash (users [username ]["password" ], password ):
65- token = create_jwt_token (username ) # Créer un token JWT avec le rôle
66- return jsonify ({"token " : token }) # Retourner le jeton JWT
60+ token = create_jwt_token (username ) # Créer un token JWT
61+ return jsonify ({"access_token " : token }) # Retourner le token JWT
6762 else :
6863 return jsonify ({"message" : "Identifiants invalides" }), 401
6964
70- # Route protégée avec JWT
71- @app .route ('/jwt-protected' )
72- @jwt_required ()
65+ # Route protégée par JWT
66+ @app .route ('/jwt-protected' , methods = [ "GET" ] )
67+ @jwt_required () # Protéger avec un token JWT
7368def jwt_protected ():
7469 return jsonify ({"message" : "JWT Auth: Access Granted" })
7570
76- # Route protégée pour les utilisateurs "admin"
77- @app .route ('/admin-only' )
78- @jwt_required ()
71+ # Route uniquement accessible aux administrateurs (Role-based Access Control)
72+ @app .route ('/admin-only' , methods = [ "GET" ] )
73+ @jwt_required () # Protéger avec un token JWT
7974def admin_only ():
80- current_user = get_jwt_identity () # Récupérer l'identifiant de l'utilisateur
81- role = get_jwt_identity ()[ ' role' ] # Récupérer le rôle de l'utilisateur depuis le JWT
75+ current_user = get_jwt_identity ()
76+ user_role = current_user [ " role" ]
8277
83- if role != 'admin' : # Vérifier que l'utilisateur a le rôle admin
84- return jsonify ({"error" : "Admin access required" }), 403
78+ # Vérifier si l'utilisateur a le rôle "admin"
79+ if user_role != "admin" :
80+ return jsonify ({"error" : "Admin access required" }), 403 # Accès refusé si ce n'est pas un admin
8581
8682 return jsonify ({"message" : "Admin Access: Granted" })
8783
88- # Gérer les erreurs de token
84+ # Gestion des erreurs liées au JWT
8985@jwt .unauthorized_loader
9086def handle_unauthorized_error (err ):
9187 return jsonify ({"error" : "Missing or invalid token" }), 401
@@ -106,5 +102,6 @@ def handle_revoked_token_error(err):
106102def handle_needs_fresh_token_error (err ):
107103 return jsonify ({"error" : "Fresh token required" }), 401
108104
105+ # Démarrer l'application Flask
109106if __name__ == '__main__' :
110107 app .run (debug = True )
0 commit comments