Source code for geochemistrypi.auth.utils
from datetime import datetime, timedelta
from typing import Union
from fastapi import HTTPException, status
from jose import JWTError, jwt
from passlib.context import CryptContext
from .constants import ALGORITHM, SECRET_KEY
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
[docs]
def get_password_hash(password):
return pwd_context.hash(password)
[docs]
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
[docs]
def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
[docs]
def decode_access_token(token: str):
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])
# username: str = payload.get("sub")
email: str = payload.get("sub")
# if username is None:
if email is None:
raise credentials_exception
# token_data = TokenData(username=username)
# token_data = TokenData(email=email)
token_data = email
except JWTError:
raise credentials_exception
return token_data