Coverage for src / fastapi_authly / core / config.py: 100%

27 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-20 11:54 +0800

1"""Configuration settings for fastapi-authly.""" 

2 

3from typing import List, Optional, Any 

4 

5from pydantic import BaseModel, Field, ConfigDict 

6from pydantic_settings import BaseSettings, SettingsConfigDict 

7from fastapi_authly.interfaces import UserRepository, PasswordHasher, TokenService, Mailer 

8 

9 

10class AuthConfig(BaseSettings): 

11 """ 

12 Runtime configuration loaded from environment variables with ``AUTH_`` prefix. 

13 

14 Host applications can still pass an ``AuthConfig`` instance directly; 

15 in that case, the passed values override the environment values. 

16 """ 

17 

18 secret_key: str = "your-secret-key-change-in-production" 

19 algorithm: str = "HS256" 

20 access_token_expire_minutes: int = 30 

21 refresh_token_expire_days: int = 7 

22 

23 router_prefix: str = "/auth" 

24 router_tags: List[str] = Field(default_factory=lambda: ["authentication"]) 

25 token_url: str = "token" 

26 

27 enable_password_recovery: bool = True 

28 enable_user_registration: bool = True 

29 enable_token_refresh: bool = True 

30 enable_html_content: bool = True 

31 

32 email_from: str = "noreply@example.com" 

33 email_from_name: str = "Auth System" 

34 password_reset_url_template: str = ( 

35 "https://yourapp.com/reset-password?token={token}" 

36 ) 

37 verification_url_template: str = ( 

38 "https://yourapp.com/verify-email?token={token}" 

39 ) 

40 

41 model_config = SettingsConfigDict( 

42 env_prefix="AUTH_", 

43 extra="ignore", 

44 ) 

45 

46 

47class AuthDependencyConfig(BaseModel): 

48 """ 

49 Optional dependency injection container. 

50 

51 Host projects can supply custom implementations for the overridable hooks. 

52 """ 

53 model_config = ConfigDict(arbitrary_types_allowed=True) 

54 

55 user_repository: Optional[Any] = None 

56 password_hasher: Optional[Any] = None 

57 token_service: Optional[Any] = None 

58 mailer: Optional[Any] = None