muryshev's picture
update
1e5d06f
raw
history blame
1.75 kB
from fastapi.security import OAuth2PasswordBearer
from fastapi import HTTPException, Depends
from datetime import datetime, timedelta, timezone
from typing import Optional
from pydantic import BaseModel
import jwt
import os
# Секретный ключ для JWT
SECRET_KEY = os.environ.get("JWT_SECRET", "ooooooh_thats_my_super_secret_key")
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 1440
class User(BaseModel):
username: str
password: str
# Захардкоженные пользователи
USERS = [
User(username="admin", password="admin123"),
User(username="demo", password="sTrUPsORPA")
]
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/login/token")
class LoginRequest(BaseModel):
username: str
password: str
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.now(timezone.utc) + expires_delta
else:
expire = datetime.now(timezone.utc) + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
async def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise HTTPException(status_code=401, detail="Invalid token")
user = next((u for u in USERS if u.username == username), None)
if user is None:
raise HTTPException(status_code=401, detail="User not found")
return user
except jwt.PyJWTError:
raise HTTPException(status_code=401, detail="Invalid token")