From 3f6891963398bbd96086dd93e389d91726fa8313 Mon Sep 17 00:00:00 2001 From: Automated Action Date: Thu, 19 Jun 2025 18:15:03 +0000 Subject: [PATCH] Update code via agent code generation --- app/core/auth.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++ app/models/user.py | 16 ++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 app/core/auth.py create mode 100644 app/models/user.py diff --git a/app/core/auth.py b/app/core/auth.py new file mode 100644 index 0000000..f754506 --- /dev/null +++ b/app/core/auth.py @@ -0,0 +1,52 @@ +import os +from datetime import datetime, timedelta +from typing import Optional +from passlib.context import CryptContext +from jose import JWTError, jwt +from fastapi import HTTPException, status + + +SECRET_KEY = os.getenv("SECRET_KEY", "your-secret-key-here") +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 30 + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + + +def verify_password(plain_password: str, hashed_password: str) -> bool: + """Verify a password against its hash.""" + return pwd_context.verify(plain_password, hashed_password) + + +def get_password_hash(password: str) -> str: + """Hash a password.""" + return pwd_context.hash(password) + + +def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): + """Create a JWT access token.""" + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + + +def verify_token(token: str): + """Verify and decode a JWT token.""" + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + email: str = payload.get("sub") + if email is None: + raise credentials_exception + return email + except JWTError: + raise credentials_exception \ No newline at end of file diff --git a/app/models/user.py b/app/models/user.py new file mode 100644 index 0000000..585f776 --- /dev/null +++ b/app/models/user.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, Integer, String, DateTime, Boolean +from sqlalchemy.sql import func +from app.db.base import Base + + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True) + email = Column(String, unique=True, index=True, nullable=False) + hashed_password = Column(String, nullable=False) + full_name = Column(String, nullable=False) + is_active = Column(Boolean, default=True) + is_superuser = Column(Boolean, default=False) + created_at = Column(DateTime, server_default=func.now()) + updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) \ No newline at end of file