import uuid import os from typing import Optional from fastapi import Depends, Request from fastapi_users import BaseUserManager, FastAPIUsers, UUIDIDMixin from fastapi_users.authentication import ( AuthenticationBackend, BearerTransport, JWTStrategy, ) from fastapi_users.db import SQLAlchemyUserDatabase from app.db import User, get_user_db from dotenv import load_dotenv # Get the current environment from the environment variable current_environment = os.getenv("APP_ENV", "dev") # Load the appropriate .env file based on the current environment if current_environment == "dev": load_dotenv(".env.dev") elif current_environment == "test": load_dotenv(".env.test") elif current_environment == "prod": load_dotenv(".env.prod") else: raise ValueError("Invalid environment specified") SECRET = os.getenv("APP_SECRET") class UserManager(UUIDIDMixin, BaseUserManager[User, uuid.UUID]): reset_password_token_secret = SECRET verification_token_secret = SECRET async def on_after_register(self, user: User, request: Optional[Request] = None): print(f"User {user.id} has registered.") async def on_after_forgot_password( self, user: User, token: str, request: Optional[Request] = None ): print(f"User {user.id} has forgot their password. Reset token: {token}") async def on_after_request_verify( self, user: User, token: str, request: Optional[Request] = None ): print(f"Verification requested for user {user.id}. Verification token: {token}") async def get_user_manager(user_db: SQLAlchemyUserDatabase = Depends(get_user_db)): yield UserManager(user_db) bearer_transport = BearerTransport(tokenUrl="auth/jwt/login") seconds_in_day = 60 * 60 * 24 seconds_in_month = seconds_in_day * 31 seconds_in_six_months = seconds_in_month * 6 def get_jwt_strategy() -> JWTStrategy: return JWTStrategy(secret=SECRET, lifetime_seconds=seconds_in_six_months) auth_backend = AuthenticationBackend( name="jwt", transport=bearer_transport, get_strategy=get_jwt_strategy, ) fastapi_users = FastAPIUsers[User, uuid.UUID](get_user_manager, [auth_backend]) current_active_user = fastapi_users.current_user(active=True)