Source code for govbr_auth.core.config

from pydantic import BaseModel, field_validator
from typing import Optional
import os
from dotenv import load_dotenv

__all__ = ["GovBrConfig"]

load_dotenv()


[docs] class GovBrConfig(BaseModel): """ Configuração para integração com o Gov.br. Esta classe contém as informações necessárias para autenticação e autorização com o Gov.br, incluindo URLs, credenciais e parâmetros de configuração. :param client_id: ID do cliente registrado na plataforma Gov.br. :param client_secret: Segredo do cliente registrado na plataforma Gov.br. :param redirect_uri: URI de redirecionamento após a autenticação. :param cript_verifier_secret: Segredo usado para criptografar o código de verificação. :param govbr_auth_url: URL de autorização da plataforma Gov.br. :param govbr_token_url: URL de token da plataforma Gov.br. :param scope: Escopo de acesso solicitado (padrão: "openid profile email"). :param response_type: Tipo de resposta esperado (padrão: "code"). :param code_challenge_method: Método de desafio de código (padrão: "S256"). :param jwt_secret: Segredo para assinatura de JWT (opcional). :param jwt_algorithm: Algoritmo de assinatura JWT (padrão: "HS256"). :param jwt_expire_minutes: Tempo de expiração do JWT em minutos (padrão: 30). :param prefix: Prefixo para as rotas de autenticação (padrão: None). :param authorize_endpoint: Endpoint de autorização (padrão: None). :param authenticate_endpoint: Endpoint de autenticação (padrão: None). :param use_fake: Ativa explicitamente o modo fake via configuração (padrão: False). :raises ValueError: Se as variáveis obrigatórias não estiverem presentes no ambiente. :raises ValueError: Se a chave de criptografia não for válida. """ client_id: str client_secret: str redirect_uri: str cript_verifier_secret: str # URLs da plataforma Gov.br govbr_auth_url: str govbr_token_url: str # Comportamento padrão do fluxo scope: str = "openid profile email" response_type: str = "code" code_challenge_method: str = "S256" # JWT jwt_secret: Optional[str] = None jwt_algorithm: str = "HS256" jwt_expire_minutes: int = 30 # URLs internas da aplicação prefix: Optional[str] = None authorize_endpoint: Optional[str] = None authenticate_endpoint: Optional[str] = None # Flags de modo use_fake: bool = False
[docs] @field_validator("authorize_endpoint", "authenticate_endpoint", "prefix") def validate_endpoint(cls, v): if v is None: return v return v.strip("/ ")
[docs] @field_validator("cript_verifier_secret") def validate_fernet_key(cls, v): if len(v.encode()) != 44: raise ValueError( "cript_verifier_secret precisa ser uma chave Fernet válida de 32 bytes base64 (44 caracteres)") return v
[docs] @classmethod def from_env(cls): missing = [var for var in ["GOVBR_CLIENT_ID", "GOVBR_CLIENT_SECRET", "GOVBR_REDIRECT_URI", "CRIPT_VERIFIER_SECRET"] if not os.getenv(var)] if missing: raise ValueError(f"As seguintes variáveis obrigatórias estão faltando no ambiente: {', '.join(missing)}") return cls( client_id=os.getenv("GOVBR_CLIENT_ID"), client_secret=os.getenv("GOVBR_CLIENT_SECRET"), redirect_uri=os.getenv("GOVBR_REDIRECT_URI"), cript_verifier_secret=os.getenv("CRIPT_VERIFIER_SECRET"), govbr_auth_url=os.getenv("GOVBR_AUTH_URL", "https://sso.acesso.gov.br/authorize"), govbr_token_url=os.getenv("GOVBR_TOKEN_URL", "https://sso.acesso.gov.br/token"), scope=os.getenv("GOVBR_SCOPE", "openid profile email"), response_type=os.getenv("GOVBR_RESPONSE_TYPE", "code"), code_challenge_method=os.getenv("GOVBR_CODE_CHALLENGE_METHOD", "S256"), jwt_secret=os.getenv("JWT_SECRET"), jwt_algorithm=os.getenv("JWT_ALGORITHM", "HS256"), jwt_expire_minutes=int(os.getenv("JWT_EXPIRE_MINUTES", 30)), use_fake=os.getenv("USE_FAKE_GOVBR", "false").lower() in ("1", "true", "yes", "y"), )