Botathon / routes_auth.py
Jeetandar N Silwani
Initial commit
d6d292e
Raw
History Blame Contribute Delete
3.23 kB
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