Skip to content

Commit f20bd47

Browse files
author
Your
committed
deer
1 parent 2fab3a3 commit f20bd47

File tree

1 file changed

+33
-66
lines changed

1 file changed

+33
-66
lines changed

task_05_basic_security.py

Lines changed: 33 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,86 +2,55 @@
22
from werkzeug.security import generate_password_hash, check_password_hash
33
from flask_httpauth import HTTPBasicAuth
44
from flask_jwt_extended import (JWTManager, create_access_token, jwt_required, get_jwt_identity)
5-
import datetime
65

7-
# Initialiser l'application Flask
86
app = 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"
158
auth = 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
2515
def 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'])
5427
def 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()
6841
def 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()
7446
def 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
8655
def handle_unauthorized_error(err):
8756
return jsonify({"error": "Missing or invalid token"}), 401
@@ -102,6 +71,4 @@ def handle_revoked_token_error(err):
10271
def 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

Comments
 (0)