Spaces:
Configuration error
Configuration error
File size: 3,229 Bytes
d6d292e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | import json
from fastapi import APIRouter, Request, Depends, Form
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.orm import Session
from database import get_db, User
from auth import hash_password, verify_password, create_access_token, get_user_from_request
router = APIRouter(prefix="/auth", tags=["auth"])
@router.get("/login", response_class=HTMLResponse)
async def login_page(request: Request, db: Session = Depends(get_db)):
from fastapi.templating import Jinja2Templates
templates = Jinja2Templates(directory="templates")
user = get_user_from_request(request, db)
if user:
return RedirectResponse(url="/dashboard", status_code=302)
return templates.TemplateResponse("login.html", {"request": request, "user": None, "error": None})
@router.post("/login")
async def login(
request: Request,
email: str = Form(...),
password: str = Form(...),
db: Session = Depends(get_db),
):
from fastapi.templating import Jinja2Templates
templates = Jinja2Templates(directory="templates")
user = db.query(User).filter(User.email == email).first()
if not user or not verify_password(password, user.password_hash):
return templates.TemplateResponse("login.html", {
"request": request,
"user": None,
"error": "Invalid email or password",
})
token = create_access_token({"sub": user.id})
response = RedirectResponse(url="/dashboard", status_code=302)
response.set_cookie("session_token", token, httponly=True, samesite="lax", max_age=86400)
return response
@router.get("/register", response_class=HTMLResponse)
async def register_page(request: Request, db: Session = Depends(get_db)):
from fastapi.templating import Jinja2Templates
templates = Jinja2Templates(directory="templates")
user = get_user_from_request(request, db)
if user:
return RedirectResponse(url="/dashboard", status_code=302)
return templates.TemplateResponse("register.html", {"request": request, "user": None, "error": None})
@router.post("/register")
async def register(
request: Request,
name: str = Form(...),
email: str = Form(...),
password: str = Form(...),
db: Session = Depends(get_db),
):
from fastapi.templating import Jinja2Templates
templates = Jinja2Templates(directory="templates")
existing = db.query(User).filter(User.email == email).first()
if existing:
return templates.TemplateResponse("register.html", {
"request": request,
"user": None,
"error": "An account with this email already exists",
})
user = User(
name=name,
email=email,
password_hash=hash_password(password),
)
db.add(user)
db.commit()
db.refresh(user)
token = create_access_token({"sub": user.id})
response = RedirectResponse(url="/dashboard", status_code=302)
response.set_cookie("session_token", token, httponly=True, samesite="lax", max_age=86400)
return response
@router.get("/logout")
async def logout():
response = RedirectResponse(url="/auth/login", status_code=302)
response.delete_cookie("session_token")
return response
|