58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
from fastapi import APIRouter, Depends, Form, Request
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.auth import clear_auth_cookie, create_access_token, set_auth_cookie
|
|
from app.core.config import get_settings
|
|
from app.core.database import get_db
|
|
from app.modules.auth.dependencies import get_current_user
|
|
from app.modules.auth.schemas import UserOut
|
|
from app.modules.auth.service import authenticate_user
|
|
|
|
router = APIRouter(prefix="/auth", tags=["auth"])
|
|
templates = Jinja2Templates(directory="app/templates")
|
|
settings = get_settings()
|
|
|
|
_NAV: list[dict] = []
|
|
|
|
|
|
@router.get("/login", response_class=HTMLResponse)
|
|
async def login_page(request: Request):
|
|
return templates.TemplateResponse(
|
|
request, "auth/login.html", {"nav_items": _NAV, "app_version": "0.1.0"}
|
|
)
|
|
|
|
|
|
@router.post("/login", response_class=HTMLResponse)
|
|
async def login(
|
|
request: Request,
|
|
username: str = Form(...),
|
|
password: str = Form(...),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
user = authenticate_user(db, username, password, ldap_enabled=settings.LDAP_ENABLED)
|
|
if user is None:
|
|
return templates.TemplateResponse(
|
|
request,
|
|
"auth/login.html",
|
|
{"nav_items": _NAV, "app_version": "0.1.0", "error": "Ungültige Zugangsdaten."},
|
|
status_code=200,
|
|
)
|
|
token = create_access_token(username=user.username, is_admin=user.is_admin)
|
|
response = RedirectResponse(url="/", status_code=303)
|
|
set_auth_cookie(response, token)
|
|
return response
|
|
|
|
|
|
@router.get("/logout")
|
|
async def logout():
|
|
response = RedirectResponse(url="/auth/login", status_code=303)
|
|
clear_auth_cookie(response)
|
|
return response
|
|
|
|
|
|
@router.get("/me", response_model=UserOut)
|
|
async def me(user=Depends(get_current_user)):
|
|
return user
|