Autenticação e Segurança
Este documento detalha os mecanismos de autenticação e segurança implementados na API de Gerenciamento de Carros.
Autenticação
JWT (JSON Web Tokens)
A API utiliza autenticação baseada em JWT (JSON Web Tokens), que é um padrão aberto (RFC 7519) para transmissão segura de informações entre partes como um objeto JSON.
Funcionamento
- O usuário faz login fornecendo email e senha
- O servidor valida as credenciais
- Se válidas, um token JWT é gerado e retornado ao cliente
- O cliente inclui esse token em requisições subsequentes para endpoints protegidos
- O servidor verifica a validade do token antes de processar a requisição
Estrutura do Token
O token JWT contém três partes codificadas em base64:
- Header: Informações sobre o tipo de token e algoritmo de assinatura
- Payload: Dados do usuário (neste caso, apenas o ID do usuário)
- Signature: Assinatura para verificar a integridade do token
Configuração
A configuração de JWT é definida em car_api/core/settings.py:
JWT_SECRET_KEY: str # Chave secreta para assinatura
JWT_ALGORITHM: str = 'HS256' # Algoritmo de assinatura
JWT_EXPIRATION_MINUTES: int = 30 # Tempo de expiração (padrão: 30 minutos)
Segurança
Hashing de Senhas
As senhas são armazenadas com hash usando o algoritmo Argon2, considerado um dos mais seguros atualmente:
- Argon2 é o vencedor do Password Hashing Competition
- Resistente a ataques de força bruta e rainbow tables
- Configurável para ajustar dificuldade de computação
Controle de Acesso
Autenticação vs Autorização
- Autenticação: Verifica a identidade do usuário (quem ele diz ser)
- Autorização: Determina se o usuário tem permissão para executar uma ação específica
Verificação de Propriedade
A API implementa controle de acesso baseado em propriedade, onde:
- Usuários só podem acessar, modificar ou excluir seus próprios carros
- A função
verify_car_ownership()garante que o usuário seja o proprietário do carro antes de permitir operações
Endpoints Protegidos
A maioria dos endpoints da API requer autenticação JWT:
/api/v1/users/*- Exceto criação de usuário/api/v1/brands/*- Todos os endpoints/api/v1/cars/*- Todos os endpoints/api/v1/auth/refresh_token- Refresh de token
Implementação de Segurança
Middleware de Autenticação
A autenticação é implementada usando o middleware HTTPBearer do FastAPI combinado com dependências:
security = HTTPBearer()
async def get_current_user(
credentials: HTTPAuthorizationCredentials = Depends(security),
db: AsyncSession = Depends(get_session),
) -> User:
# Validação do token e retorno do usuário autenticado
Funções de Segurança
As funções de segurança estão implementadas em car_api/core/security.py:
get_password_hash(): Gera hash de senhaverify_password(): Verifica se uma senha corresponde ao hashcreate_access_token(): Cria token JWTverify_token(): Verifica validade e integridade do tokenauthenticate_user(): Autentica usuário com email e senhaget_current_user(): Obtém usuário autenticado a partir do tokenverify_car_ownership(): Verifica propriedade de carro
Melhores Práticas de Segurança
1. Armazenamento de Credenciais
- Variáveis de ambiente: Chaves JWT e URLs de banco de dados são armazenadas em variáveis de ambiente
- Arquivo .env: Não versionado para evitar exposição de credenciais
- Hashing de senhas: Nunca armazena senhas em texto plano
2. Transmissão de Dados
- HTTPS: Recomendado para proteger dados em trânsito
- Tokens JWT: Contêm apenas informações mínimas necessárias
- Validação de entrada: Todos os dados são validados usando Pydantic
3. Controle de Acesso
- Princípio do menor privilégio: Usuários só acessam recursos necessários
- Validação contínua: Cada requisição a endpoints protegidos é validada
- Separação de responsabilidades: Lógica de segurança isolada em módulo dedicado
Considerações de Segurança
Vulnerabilidades Mitigadas
- Injeção de SQL: Prevenida pelo uso de SQLAlchemy com consultas parametrizadas
- Cross-Site Scripting (XSS): Mitigada pela validação rigorosa de dados
- Cross-Site Request Forgery (CSRF): Reduzida pelo uso de tokens JWT stateless
- Exposição de dados: Prevenida pelo controle de acesso baseado em propriedade
Recomendações para Produção
- Chaves JWT seguras: Use chaves secretas fortes e rotacionáveis
- Monitoramento: Implemente logging de tentativas de acesso não autorizado
- Limitação de taxa: Considere implementar rate limiting para prevenir brute force
- HTTPS obrigatório: Sempre use HTTPS em ambientes de produção
- Atualizações de segurança: Mantenha as dependências atualizadas
- Auditoria de segurança: Realize auditorias regulares de código e configurações
Recuperação de Acesso
Atualmente, o sistema não implementa recuperação de senha, mas a arquitetura permite fácil implementação futura com:
- Geração de tokens temporários de recuperação
- Envio por email verificado
- Validade limitada desses tokens
Considerações sobre Tokens JWT
Vantagens
- Stateless: Não requer armazenamento de sessão no servidor
- Eficiente: Processamento rápido de autenticação
- Escalável: Adequado para sistemas distribuídos
- Seguro: Assinatura digital previne adulteração
Limitações
- Não revogável: Uma vez emitido, o token é válido até expirar
- Tamanho: Maior que cookies de sessão tradicionais
- Armazenamento: Deve ser armazenado com segurança no cliente
A implementação atual considera essas limitações e pode ser estendida para incluir mecanismos de revogação de tokens conforme necessário.