Fluxo de Segurança
graph TD
A[Requisição HTTP] --> B{Endpoint público?}
B -->|Sim| C[Permitir acesso]
B -->|Não| D[Verificar JWT no cabeçalho]
D --> E{Token válido?}
E -->|Não| F[Retornar 401 Unauthorized]
E -->|Sim| G[Extrair ID do usuário do token]
G --> H[Buscar usuário no banco de dados]
H --> I{Usuário existe?}
I -->|Não| F
I -->|Sim| J[Verificar permissões específicas]
J --> K{Tem permissão?}
K -->|Não| L[Retornar 403 Forbidden]
K -->|Sim| M[Executar operação solicitada]
M --> N[Retornar resposta]
O[Envio de credenciais] --> P[Receber email e senha]
P --> Q[Buscar usuário por email]
Q --> R{Usuário encontrado?}
R -->|Não| S[Retornar 401 Unauthorized]
R -->|Sim| T[Verificar senha com Argon2]
T --> U{Senha correta?}
U -->|Não| S
U -->|Sim| V[Gerar token JWT]
V --> W[Retornar token JWT]
X[Armazenamento de senha] --> Y[Receber senha em texto plano]
Y --> Z[Hash com Argon2]
Z --> AA[Salvar hash no banco de dados]
C --> N
F --> N
L --> N
W --> N
AA --> N
style A fill:#E1F5FE
style F fill:#FFEBEE
style L fill:#FFEBEE
style N fill:#E8F5E8
style V fill:#FFF3E0
style Z fill:#FFF3E0
Descrição do Fluxo de Segurança
1. Autenticação de Requisições
O processo de segurança começa com cada requisição recebida pela API:
- Verificação de Endpoint Público: A API primeiro determina se o endpoint solicitado é público ou protegido
- Validação de Token JWT: Para endpoints protegidos, a API verifica a presença e validade do token JWT no cabeçalho de autorização
- Extração de Identidade: Se o token for válido, a identidade do usuário é extraída do payload do JWT
- Verificação de Existência: A API verifica se o usuário ainda existe no banco de dados
- Verificação de Permissões: A API verifica se o usuário tem permissões específicas para a operação solicitada
2. Processo de Login
Quando um usuário tenta fazer login:
- Recebimento de Credenciais: A API recebe email e senha do cliente
- Busca de Usuário: A API busca o usuário correspondente ao email fornecido
- Verificação de Senha: A senha fornecida é verificada contra o hash armazenado usando Argon2
- Geração de Token: Se as credenciais forem válidas, um token JWT é gerado e retornado
3. Armazenamento de Senhas
Quando um usuário define ou altera sua senha:
- Recebimento de Senha: A senha é recebida em texto plano (deve ser via HTTPS)
- Hashing com Argon2: A senha é transformada em um hash usando o algoritmo Argon2
- Armazenamento Seguro: Apenas o hash é armazenado no banco de dados, nunca a senha em texto plano
Camadas de Segurança
Camada de Transporte
- HTTPS: Todas as comunicações devem ser feitas via HTTPS para proteger dados em trânsito
- Segurança de Headers: Implementação de headers de segurança HTTP
Camada de Autenticação
- JWT Tokens: Autenticação stateless baseada em tokens assinados
- Tempo de Expiração: Tokens expiram após período configurável (padrão: 30 minutos)
- Algoritmo de Assinatura: HS256 com chave secreta forte
Camada de Autorização
- Verificação de Propriedade: Usuários só podem acessar recursos que lhes pertencem
- Controle de Acesso Baseado em Função: Diferentes níveis de acesso para diferentes tipos de usuários
Camada de Dados
- Hashing de Senhas: Uso do Argon2, um dos algoritmos mais seguros para hashing de senhas
- Proteção contra SQL Injection: Uso de SQLAlchemy com consultas parametrizadas
- Validação de Entrada: Validação rigorosa de todos os dados recebidos
Medidas de Segurança Implementadas
- Proteção contra Brute Force: Embora não implementado explicitamente, a arquitetura permite adicionar limitação de taxa
- Revogação de Sessão: Embora os tokens JWT sejam stateless, a arquitetura permite implementar listas de revogação
- Auditoria de Acesso: A estrutura permite implementar logging de acessos e operações
- Validação de Dados: Todos os dados são validados usando Pydantic para prevenir injeção de dados maliciosos
Tratamento de Erros de Segurança
- Erros Genéricos: Mensagens de erro genéricas para evitar vazamento de informações
- Logging de Tentativas: Registro de tentativas de acesso não autorizado (quando implementado)
- Bloqueio de Conta: A arquitetura permite implementar bloqueio temporário após múltiplas tentativas fracassadas