feat: création de l'API /api/setup avec pydantic pour la création du compte Admin
This commit is contained in:
1 parent
b8d9cd5520
commit
13abdc68af
2 files changed
+45
-6
No files matched your search
+39
-6
@@ -1,12 +1,14 @@
|
|||||||
from fastapi import FastAPI, Depends
|
from fastapi import FastAPI, Depends, HTTPException, status
|
||||||
from fastapi.responses import RedirectResponse
|
from fastapi.responses import RedirectResponse
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
|
|
||||||
# Importation de nos modules locaux
|
# Importation de nos modules locaux
|
||||||
from .database import engine, Base, get_db
|
from .database import engine, Base, get_db
|
||||||
from .models import User
|
from .models import User
|
||||||
|
from .auth import get_password_hash, generate_totp_secret, get_totp_uri
|
||||||
|
from .schemas import AdminCreate
|
||||||
|
|
||||||
# Création des tables dans la base de données (si elles n'existent pas)
|
# Création des tables dans la base de données
|
||||||
Base.metadata.create_all(bind=engine)
|
Base.metadata.create_all(bind=engine)
|
||||||
|
|
||||||
app = FastAPI(title="AETHAS38 - Orchestrateur Multi-IA")
|
app = FastAPI(title="AETHAS38 - Orchestrateur Multi-IA")
|
||||||
@@ -18,21 +20,52 @@ def is_setup_required(db: Session) -> bool:
|
|||||||
|
|
||||||
@app.get("/")
|
@app.get("/")
|
||||||
def read_root(db: Session = Depends(get_db)):
|
def read_root(db: Session = Depends(get_db)):
|
||||||
"""Route principale : redirige selon l'état de l'installation."""
|
|
||||||
if is_setup_required(db):
|
if is_setup_required(db):
|
||||||
return RedirectResponse(url="/setup")
|
return RedirectResponse(url="/setup")
|
||||||
return RedirectResponse(url="/login")
|
return RedirectResponse(url="/login")
|
||||||
|
|
||||||
@app.get("/setup")
|
@app.get("/setup")
|
||||||
def setup_page(db: Session = Depends(get_db)):
|
def setup_page(db: Session = Depends(get_db)):
|
||||||
"""Affiche l'assistant d'installation (Frontend Vue.js à venir)."""
|
|
||||||
if not is_setup_required(db):
|
if not is_setup_required(db):
|
||||||
return RedirectResponse(url="/login")
|
return RedirectResponse(url="/login")
|
||||||
return {"message": "Assistant d'installation AETHAS38. Veuillez créer le compte Administrateur."}
|
return {"message": "Assistant d'installation AETHAS38. Veuillez créer le compte Administrateur."}
|
||||||
|
|
||||||
@app.get("/login")
|
@app.get("/login")
|
||||||
def login_page(db: Session = Depends(get_db)):
|
def login_page(db: Session = Depends(get_db)):
|
||||||
"""Affiche la page de connexion sécurisée."""
|
|
||||||
if is_setup_required(db):
|
if is_setup_required(db):
|
||||||
return RedirectResponse(url="/setup")
|
return RedirectResponse(url="/setup")
|
||||||
return {"message": "Page de connexion (Frontend Vue.js à venir)."}
|
return {"message": "Page de connexion."}
|
||||||
|
|
||||||
|
@app.post("/api/setup")
|
||||||
|
def create_admin(admin_data: AdminCreate, db: Session = Depends(get_db)):
|
||||||
|
"""Reçoit les données du frontend, crée l'admin et retourne le QR Code 2FA."""
|
||||||
|
if not is_setup_required(db):
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=status.HTTP_403_FORBIDDEN,
|
||||||
|
detail="L'installation a déjà été effectuée."
|
||||||
|
)
|
||||||
|
|
||||||
|
# Sécurisation des accès
|
||||||
|
hashed_pw = get_password_hash(admin_data.password)
|
||||||
|
totp_secret = generate_totp_secret()
|
||||||
|
|
||||||
|
new_admin = User(
|
||||||
|
email=admin_data.email,
|
||||||
|
username=admin_data.username,
|
||||||
|
hashed_password=hashed_pw,
|
||||||
|
totp_secret=totp_secret,
|
||||||
|
is_admin=True
|
||||||
|
)
|
||||||
|
|
||||||
|
db.add(new_admin)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(new_admin)
|
||||||
|
|
||||||
|
# Génération de l'URI pour l'affichage du QR Code côté frontend
|
||||||
|
totp_uri = get_totp_uri(totp_secret, new_admin.username)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"message": "Administrateur créé avec succès.",
|
||||||
|
"totp_secret": totp_secret,
|
||||||
|
"totp_uri": totp_uri
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
from pydantic import BaseModel, EmailStr
|
||||||
|
|
||||||
|
class AdminCreate(BaseModel):
|
||||||
|
email: EmailStr
|
||||||
|
username: str
|
||||||
|
password: str
|
||||||
Reference in new issue
Block a user