/
ivanstrike
/
tasker
Обзор
Документация
Войти
/
ivanstrike
/
tasker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
python_Sklyarenko/Lab1/app/auth.py
45 строк
2 KB
ivanstrike
Lab3
13 дек 2025, 11:15
13 дек 2025, 11:15
15c0fa5
Код
Авторство
О чём код?
from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from passlib.hash import pbkdf2_sha256 as hasher from datetime import datetime, timedelta import jwt import os from .database import get_db from . import models, schemas router = APIRouter(prefix="/api/v1/auth", tags=["auth"]) JWT_SECRET = os.getenv("JWT_SECRET", "change_me_in_production") JWT_ALGORITHM = os.getenv("JWT_ALGORITHM", "HS256") ACCESS_TOKEN_EXPIRE_MINUTES = int(os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", "120")) def create_access_token(data: dict, expires_delta: timedelta | None = None): to_encode = data.copy() expire = datetime.utcnow() + (expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode(to_encode, JWT_SECRET, algorithm=JWT_ALGORITHM) return encoded_jwt @router.post("/register", response_model=schemas.UserOut, status_code=201) def register(user: schemas.UserCreate, db: Session = Depends(get_db)): exists = db.query(models.User).filter(models.User.email == user.email).first() if exists: raise HTTPException(status_code=409, detail="Email already registered") u = models.User(email=user.email, password_hash=hasher.hash(user.password)) db.add(u) db.commit() db.refresh(u) return u class LoginRequest(schemas.BaseModel): email: schemas.EmailStr password: str @router.post("/login", response_model=schemas.Token) def login(req: LoginRequest, db: Session = Depends(get_db)): u = db.query(models.User).filter(models.User.email == req.email).first() if not u or not hasher.verify(req.password, u.password_hash): raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials") token = create_access_token({"sub": str(u.id), "email": u.email}) return {"access_token": token, "token_type": "bearer"}