Repository navigation
Expand file tree
/
Copy pathauth.py
More file actions
51 lines (42 loc) · 1.77 KB
/
Copy pathauth.py
File metadata and controls
51 lines (42 loc) · 1.77 KB
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
from datetime import datetime, timedelta, timezone
from typing import Optional
from jose import JWTError, jwt
from passlib.context import CryptContext
from sqlalchemy.orm import Session
from models import User, Session as DBSession
SECRET_KEY = "ochen_dlinnyi_i_slozhnyi_sekretnyi_kod_andrey_zubrila"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
pwd_context = CryptContext(schemes=["argon2"], deprecated="auto")
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password):
return pwd_context.hash(password)
def get_user_by_login(db: Session, login: str) -> Optional[User]:
return db.query(User).filter(User.login == login).first()
def authenticate_user(db: Session, login: str, password: str) -> Optional[User]:
user = get_user_by_login(db, login)
if not user:
return None
if not verify_password(password, user.password_hash):
return None
return user
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=ACCESS_TOKEN_EXPIRE_MINUTES)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
def get_current_user(token: str, db: Session) -> Optional[User]:
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
login: str = payload.get("sub")
if login is None:
return None
except JWTError:
return None
user = get_user_by_login(db, login)
return user