Skip to content

Commit 2fab3a3

Browse files
author
Your
committed
deer
1 parent 8e1f44e commit 2fab3a3

File tree

1 file changed

+41
-44
lines changed

1 file changed

+41
-44
lines changed

task_05_basic_security.py

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,88 +4,84 @@
44
from flask_jwt_extended import (JWTManager, create_access_token, jwt_required, get_jwt_identity)
55
import datetime
66

7+
# Initialiser l'application Flask
78
app = 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
1315
auth = HTTPBasicAuth()
1416

1517
# Liste des utilisateurs avec mots de passe hashés et rôles
1618
users = {
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
2925
def 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
4530
def 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"])
5854
def 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
7368
def 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
7974
def 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
9086
def handle_unauthorized_error(err):
9187
return jsonify({"error": "Missing or invalid token"}), 401
@@ -106,5 +102,6 @@ def handle_revoked_token_error(err):
106102
def handle_needs_fresh_token_error(err):
107103
return jsonify({"error": "Fresh token required"}), 401
108104

105+
# Démarrer l'application Flask
109106
if __name__ == '__main__':
110107
app.run(debug=True)

0 commit comments

Comments
 (0)