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

First commit

Browse files
Files changed (5) hide show
  1. .dockerignore +6 -0
  2. .gitignore +14 -0
  3. Dockerfile +6 -0
  4. main.py +72 -0
  5. requirements.txt +5 -0
.dockerignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ __pycache__
2
+ *.pyc
3
+ .env
4
+ .env.*
5
+ venv
6
+ serviceAccountKey.json
.gitignore ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Environment variables
2
+ .env
3
+ .env.local
4
+ .env.*.local
5
+
6
+ # Python
7
+ __pycache__/
8
+ *.py[cod]
9
+ *$py.class
10
+ venv/
11
+
12
+ # Node
13
+ dist/
14
+ serviceAccountKey.json
Dockerfile ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ FROM python:3.9
2
+ WORKDIR /code
3
+ COPY ./requirements.txt /code/requirements.txt
4
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
5
+ COPY . /code
6
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
main.py ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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"}
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ python-dotenv
4
+ firebase-admin
5
+ python-multipart