mirror of
https://github.com/cssgunc/compass.git
synced 2025-04-17 17:30:17 -04:00
84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
# token_utils.py
|
|
import jwt
|
|
from jwt import PyJWTError
|
|
from datetime import datetime, timedelta
|
|
from fastapi import HTTPException, status, Depends
|
|
from backend.models.user_model import User
|
|
from ..services import UserService
|
|
from passlib.context import CryptContext
|
|
|
|
from supabase import create_client, Client
|
|
|
|
# Supabase configuration
|
|
SUPABASE_URL = "placeholder"
|
|
SUPABASE_KEY = "sample key"
|
|
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
|
|
|
|
SECRET = "SECRET_KEY"
|
|
ALGORITHM = "HS256"
|
|
|
|
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
|
|
|
|
def create_bearer_token(user_uuid: str, expires_delta: timedelta = None) -> str:
|
|
if expires_delta:
|
|
expire = datetime.now(datetime.UTC) + expires_delta
|
|
else:
|
|
expire = datetime.now(datetime.UTC) + timedelta(minutes=180)
|
|
|
|
to_encode = {
|
|
"sub": user_uuid,
|
|
"exp": expire,
|
|
}
|
|
|
|
token = jwt.encode(to_encode, SECRET, algorithm=ALGORITHM)
|
|
|
|
expires_at = expire.isoformat()
|
|
token_data = {
|
|
"user_uuid": user_uuid,
|
|
"token": token,
|
|
"expires_at": expires_at,
|
|
}
|
|
|
|
response = supabase.table("user_tokens").insert(token_data).execute()
|
|
|
|
|
|
def decode_token(token: str) -> User:
|
|
try:
|
|
payload = jwt.decode(token, SECRET, algorithms=[ALGORITHM])
|
|
user_uuid = payload.get("sub")
|
|
if user_uuid is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Invalid credentials",
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
)
|
|
|
|
user_data = UserService.get_user_by_uuid(user_uuid)
|
|
if user_data is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="User not found",
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
)
|
|
|
|
user = User(
|
|
id=user_data.id,
|
|
username=user_data.username,
|
|
email=user_data.email,
|
|
experience=user_data.experience,
|
|
group=user_data.group,
|
|
program=user_data.program,
|
|
role=user_data.role,
|
|
created_at=user_data.created_at,
|
|
uuid=user_data.uuid,
|
|
)
|
|
|
|
return user
|
|
except PyJWTError:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Invalid or expired token",
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
)
|