Coverage for src / auth / schemas / auth_schema.py: 100%

59 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 14:29 -0300

1"""Schemas pydantic do modulo auth.""" 

2 

3from pydantic import BaseModel, Field, model_validator 

4 

5from src.auth.models import AuthMode, AuthProvider 

6 

7PROVIDER_ALIASES = {"keycloack": "keycloak"} 

8 

9 

10def normalize_provider_name(provider_name: str) -> str: 

11 """Normaliza nome de provedor, aceitando aliases comuns.""" 

12 return PROVIDER_ALIASES.get(provider_name, provider_name) 

13 

14 

15class AuthProviderConfigSchema(BaseModel): 

16 """Configuracao de um provedor de autenticacao.""" 

17 

18 provider: AuthProvider 

19 enabled: bool = False 

20 mode: AuthMode 

21 client_id: str | None = None 

22 client_secret: str | None = None 

23 authorization_url: str | None = None 

24 token_url: str | None = None 

25 redirect_uri: str | None = None 

26 scopes: list[str] = Field(default_factory=list) 

27 tenant: str | None = None 

28 server_url: str | None = None 

29 realm: str | None = None 

30 ldap_uri: str | None = None 

31 base_dn: str | None = None 

32 bind_dn: str | None = None 

33 bind_password: str | None = None 

34 users: dict[str, str] = Field(default_factory=dict) 

35 

36 

37class AuthProviderPublicConfigSchema(BaseModel): 

38 """Configuracao publica de provedor (sem segredos).""" 

39 

40 provider: AuthProvider 

41 enabled: bool 

42 mode: AuthMode 

43 client_id: str | None = None 

44 authorization_url: str | None = None 

45 token_url: str | None = None 

46 redirect_uri: str | None = None 

47 scopes: list[str] = Field(default_factory=list) 

48 tenant: str | None = None 

49 server_url: str | None = None 

50 realm: str | None = None 

51 ldap_uri: str | None = None 

52 base_dn: str | None = None 

53 bind_dn: str | None = None 

54 local_usernames: list[str] = Field(default_factory=list) 

55 

56 

57class AuthProvidersResponseSchema(BaseModel): 

58 """Payload da listagem de provedores.""" 

59 

60 providers: list[AuthProviderPublicConfigSchema] 

61 

62 

63class AuthLoginRequestSchema(BaseModel): 

64 """Payload para login com qualquer provedor.""" 

65 

66 provider: AuthProvider 

67 username: str | None = None 

68 password: str | None = None 

69 authorization_code: str | None = None 

70 

71 @model_validator(mode="before") 

72 @classmethod 

73 def normalize_aliases(cls, values): 

74 """Aceita aliases de nomes de provedores no payload.""" 

75 if isinstance(values, dict) and "provider" in values: 

76 provider = str(values["provider"]) 

77 values["provider"] = normalize_provider_name(provider) 

78 return values 

79 

80 

81class AuthLoginResponseSchema(BaseModel): 

82 """Payload de sucesso de autenticacao.""" 

83 

84 authenticated: bool 

85 provider: AuthProvider 

86 token_type: str = "bearer" 

87 access_token: str 

88 detail: str