Skip to content

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

  1. O usuário faz login fornecendo email e senha
  2. O servidor valida as credenciais
  3. Se válidas, um token JWT é gerado e retornado ao cliente
  4. O cliente inclui esse token em requisições subsequentes para endpoints protegidos
  5. 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 senha
  • verify_password(): Verifica se uma senha corresponde ao hash
  • create_access_token(): Cria token JWT
  • verify_token(): Verifica validade e integridade do token
  • authenticate_user(): Autentica usuário com email e senha
  • get_current_user(): Obtém usuário autenticado a partir do token
  • verify_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

  1. Chaves JWT seguras: Use chaves secretas fortes e rotacionáveis
  2. Monitoramento: Implemente logging de tentativas de acesso não autorizado
  3. Limitação de taxa: Considere implementar rate limiting para prevenir brute force
  4. HTTPS obrigatório: Sempre use HTTPS em ambientes de produção
  5. Atualizações de segurança: Mantenha as dependências atualizadas
  6. 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.