2nzi commited on
Commit
6d8700d
·
verified ·
1 Parent(s): 53e151f

correction main

Browse files
Files changed (1) hide show
  1. main.py +104 -71
main.py CHANGED
@@ -1,72 +1,105 @@
1
- from fastapi import FastAPI, Depends, HTTPException, Header
2
- from fastapi.middleware.cors import CORSMiddleware
3
- from firebase_admin import auth, credentials, initialize_app
4
- from functools import wraps
5
- import firebase_admin
6
- import os
7
- import json
8
- from dotenv import load_dotenv
9
-
10
- # Charger les variables d'environnement
11
- load_dotenv()
12
-
13
- app = FastAPI()
14
-
15
- # Configuration CORS pour autoriser les requêtes depuis le frontend
16
- app.add_middleware(
17
- CORSMiddleware,
18
- allow_origins=[
19
- "http://localhost:5173",
20
- "https://junsen-ai.vercel.app",
21
- # "https://huggingface.co"
22
- ],
23
- allow_credentials=True,
24
- allow_methods=["*"],
25
- allow_headers=["*"],
26
- )
27
-
28
- # Initialiser Firebase avec les credentials depuis les variables d'environnement
29
- if os.getenv('FIREBASE_CREDENTIALS'):
30
- cred_dict = json.loads(os.getenv('FIREBASE_CREDENTIALS'))
31
- cred = credentials.Certificate(cred_dict)
32
- else:
33
- # Fallback pour le développement local
34
- cred = credentials.Certificate("serviceAccountKey.json")
35
-
36
- firebase_admin.initialize_app(cred)
37
-
38
- # Middleware pour vérifier le token Firebase
39
- async def verify_token(authorization: str = Header(...)):
40
- try:
41
- token = authorization.split("Bearer ")[1]
42
- decoded_token = auth.verify_id_token(token)
43
- return decoded_token
44
- except Exception:
45
- raise HTTPException(status_code=401, detail="Token invalide")
46
-
47
- # Décorateur pour restreindre l'accès en fonction des rôles
48
- def require_role(roles):
49
- def decorator(func):
50
- @wraps(func)
51
- async def wrapper(*args, token=Depends(verify_token), **kwargs):
52
- if token.get("role") not in roles:
53
- raise HTTPException(status_code=403, detail="Accès non autorisé")
54
- return await func(*args, **kwargs)
55
- return wrapper
56
- return decorator
57
-
58
- # Routes sécurisées
59
- @app.get("/api/protected/admin")
60
- @require_role(["admin"])
61
- async def admin_only():
62
- return {"message": "Route admin"}
63
-
64
- @app.get("/api/protected/user")
65
- @require_role(["user", "admin"])
66
- async def user_route():
67
- return {"message": "Route utilisateur"}
68
-
69
- # Route de test pour vérifier que le serveur fonctionne
70
- @app.get("/")
71
- async def root():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  return {"message": "Backend Junsen AI opérationnel"}
 
1
+ from fastapi import FastAPI, Depends, HTTPException, Header
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from firebase_admin import auth, credentials, initialize_app
4
+ from functools import wraps
5
+ import firebase_admin
6
+ import os
7
+ import json
8
+ from dotenv import load_dotenv
9
+
10
+ # Charger les variables d'environnement
11
+ load_dotenv()
12
+
13
+ app = FastAPI()
14
+
15
+ # Configuration CORS pour autoriser les requêtes depuis le frontend
16
+ app.add_middleware(
17
+ CORSMiddleware,
18
+ allow_origins=[
19
+ "http://localhost:5173",
20
+ "http://localhost:8000",
21
+ "https://junsen-ai.vercel.app",
22
+ "https://2nzi-backendjunsen.hf.space"
23
+ ],
24
+ allow_credentials=True,
25
+ allow_methods=["*"],
26
+ allow_headers=["*"],
27
+ )
28
+ # Décorateur pour restreindre l'accès en fonction des rôles
29
+ def require_role(roles):
30
+ def decorator(func):
31
+ @wraps(func)
32
+ async def wrapper(*args, token=Depends(verify_token), **kwargs):
33
+ print("Token dans require_role:", token)
34
+ print("Rôle requis:", roles)
35
+ print("Rôle trouvé:", token.get("role"))
36
+ if token.get("role") not in roles:
37
+ raise HTTPException(
38
+ status_code=403,
39
+ detail={"message": "Accès non autorisé", "role": token.get("role")}
40
+ )
41
+ return await func(*args, **kwargs)
42
+ return wrapper
43
+ return decorator
44
+ # Initialiser Firebase avec les credentials depuis les variables d'environnement
45
+ if os.getenv('FIREBASE_CREDENTIALS'):
46
+ cred_dict = json.loads(os.getenv('FIREBASE_CREDENTIALS'))
47
+ cred = credentials.Certificate(cred_dict)
48
+ else:
49
+ # Fallback pour le développement local
50
+ cred = credentials.Certificate("serviceAccountKey.json")
51
+
52
+ firebase_admin.initialize_app(cred)
53
+
54
+ async def verify_token(authorization: str = Header(...)):
55
+ try:
56
+ print("Authorization reçu:", authorization[:50] + "...")
57
+ token = authorization.split("Bearer ")[1]
58
+ print("Token extrait:", token[:50] + "...")
59
+ decoded_token = auth.verify_id_token(token)
60
+
61
+ # Récupérer les custom claims ou le rôle depuis Firestore
62
+ try:
63
+ user = auth.get_user(decoded_token['uid'])
64
+ print("User data:", user._data)
65
+ except Exception as e:
66
+ print("Erreur lors de la récupération des données utilisateur:", str(e))
67
+
68
+ return decoded_token
69
+ except Exception as e:
70
+ print("Erreur de vérification:", str(e))
71
+ raise HTTPException(
72
+ status_code=401,
73
+ detail={
74
+ "message": "Token invalide",
75
+ "error": str(e)
76
+ }
77
+ )
78
+
79
+ @app.get("/api/protected/user")
80
+ @require_role(["user_extern", "admin"])
81
+ async def user_route():
82
+ try:
83
+ return {"message": "Route utilisateur"}
84
+ except Exception as e:
85
+ print("Erreur dans user_route:", str(e))
86
+ raise HTTPException(
87
+ status_code=500,
88
+ detail={
89
+ "message": "Erreur serveur",
90
+ "error": str(e)
91
+ }
92
+ )
93
+
94
+
95
+
96
+ # Routes sécurisées
97
+ @app.get("/api/protected/admin")
98
+ @require_role(["admin"])
99
+ async def admin_only():
100
+ return {"message": "Route admin"}
101
+
102
+ # Route de test pour vérifier que le serveur fonctionne
103
+ @app.get("/")
104
+ async def root():
105
  return {"message": "Backend Junsen AI opérationnel"}