22from werkzeug .security import generate_password_hash , check_password_hash
33from flask_httpauth import HTTPBasicAuth
44from flask_jwt_extended import (JWTManager , create_access_token , jwt_required , get_jwt_identity )
5- import datetime
65
7- # Initialiser l'application Flask
86app = Flask (__name__ )
9-
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 )
13-
14- # Initialiser l'authentification de base
7+ app .config ["SECRET_KEY" ] = "theoretically predictable"
158auth = HTTPBasicAuth ()
9+ jwt = JWTManager (app )
1610
17- # Liste des utilisateurs avec mots de passe hashés et rôles
18- users = {
19- "user1" : {"username" : "user1" , "password" : generate_password_hash ("password" ), "role" : "user" },
20- "admin1" : {"username" : "admin1" , "password" : generate_password_hash ("password" ), "role" : "admin" }
21- }
11+ users = {"user1" : {"username" : "user1" , "password" : generate_password_hash ("password" ), "role" : "user" },
12+ "admin1" : {"username" : "admin1" , "password" : generate_password_hash ("password" ), "role" : "admin" }}
2213
23- # Vérification du mot de passe avec Basic Auth
2414@auth .verify_password
2515def verify_password (username , password ):
26- if username in users and check_password_hash (users [username ]["password" ], password ):
27- return username # Authentification réussie
28-
29- # Fonction pour créer un token JWT
30- def create_jwt_token (username ):
31- expiration = datetime .datetime .utcnow () + datetime .timedelta (hours = 1 ) # Le token expire après 1 heure
32- user_data = users [username ]
33- payload = {
34- 'sub' : username ,
35- 'role' : user_data ["role" ], # Ajout du rôle dans le payload du JWT
36- 'exp' : expiration
37- }
38- token = create_access_token (identity = username , additional_claims = {"role" : user_data ["role" ]}) # Création du JWT
39- return token
40-
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" })
16+ user = users .get (username )
17+ if user and check_password_hash (user ['password' ], password ):
18+ return user
19+ return None
4620
47- # Route publique (sans authentification )
48- @app . route ( '/' )
49- def home ():
50- return jsonify ({ "message" : "Bienvenue sur l'API !" })
21+ @ app . route ( '/basic-protected' )
22+ @auth . login_required
23+ def basic_protected ():
24+ return "Basic Auth: Access Granted"
5125
52- # Route pour se connecter et obtenir un JWT
53- @app .route ('/login' , methods = ["POST" ])
26+ @app .route ('/login' , methods = ['POST' ])
5427def login ():
55- username = request .json . get ( "username" )
56- password = request . json . get ("password" )
57-
58- # Vérification des identifiants
59- if username in users and check_password_hash (users [ username ][ " password" ], password ):
60- token = create_jwt_token ( username ) # Créer un token JWT
61- return jsonify ({ " access_token" : token }) # Retourner le token JWT
62- else :
63- return jsonify ({"message " : "Identifiants invalides " }), 401
64-
65- # Route protégée par JWT
66- @app .route ('/jwt-protected' , methods = [ "GET" ] )
67- @jwt_required () # Protéger avec un token JWT
28+ data = request .get_json ( )
29+ username = data . get ('username' )
30+ password = data . get ( 'password' )
31+ user = users . get ( username )
32+ if user and check_password_hash (user [ ' password' ], password ):
33+ access_token = create_access_token ( identity = { ' username' : username , 'role' : user [ 'role' ]})
34+ return jsonify (access_token = access_token )
35+
36+ return jsonify ({"error " : "Invalid credentials " }), 401
37+
38+
39+ @app .route ('/jwt-protected' )
40+ @jwt_required ()
6841def jwt_protected ():
69- return jsonify ({ "message" : " JWT Auth: Access Granted"})
42+ return " JWT Auth: Access Granted"
7043
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
44+ @app .route ('/admin-only' )
45+ @jwt_required ()
7446def admin_only ():
7547 current_user = get_jwt_identity ()
76- user_role = current_user ["role" ]
7748
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
49+ if current_user ['role' ] != 'admin' :
50+ return jsonify ({"error" : "Admin access required" }), 403
8151
82- return jsonify ({ "message" : " Admin Access: Granted"})
52+ return " Admin Access: Granted"
8353
84- # Gestion des erreurs liées au JWT
8554@jwt .unauthorized_loader
8655def handle_unauthorized_error (err ):
8756 return jsonify ({"error" : "Missing or invalid token" }), 401
@@ -102,6 +71,4 @@ def handle_revoked_token_error(err):
10271def handle_needs_fresh_token_error (err ):
10372 return jsonify ({"error" : "Fresh token required" }), 401
10473
105- # Démarrer l'application Flask
106- if __name__ == '__main__' :
107- app .run (debug = True )
74+ app .run ()
0 commit comments