Fluxos de Autenticação

Este documento detalha os processos de login por e-mail/senha e login pelo Google na aplicação SaaS.

1. Login por E-mail e Senha

Diagrama de Sequência

sequenceDiagram participant Usuário participant Frontend participant AuthController participant AuthService participant UserRepository Usuário->>Frontend: Insere e-mail e senha Frontend->>AuthController: POST /api/auth/login AuthController->>AuthService: LoginAsync(LoginDto) AuthService->>UserRepository: GetByEmailAsync(email) UserRepository-->>AuthService: User AuthService->>AuthService: Verifica senha AuthService->>AuthService: Gera token JWT AuthService-->>AuthController: AuthResponseDto AuthController-->>Frontend: 200 OK Frontend-->>Usuário: Redireciona para dashboard

Passo a Passo

  1. Entrada de Dados

    • Usuário insere e-mail e senha no formulário de login
  2. Requisição ao Backend

    POST /api/auth/login
    {
      "email": "usuario@exemplo.com",
      "password": "senha123"
    }
  3. Validação

    • Verifica se e-mail e senha foram fornecidos
    • Valida formato do e-mail
  4. Busca do Usuário

    var user = await _userRepository.GetByEmailAsync(loginDto.Email);
  5. Verificação de Senha

    var result = _passwordHasher.VerifyHashedPassword(user, user.PasswordHash, loginDto.Password);
  6. Geração do Token JWT

    var token = GenerateJwtToken(user);
  7. Resposta

    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "name": "João Silva",
      "email": "usuario@exemplo.com"
    }

2. Login pelo Google

Diagrama de Sequência

sequenceDiagram participant Usuário participant Google participant Frontend participant AuthController participant AuthService participant UserRepository Usuário->>Google: Faz login na conta Google Google-->>Frontend: Retorna ID Token Frontend->>AuthController: POST /api/auth/google AuthController->>AuthService: GoogleLoginAsync(GoogleAuthRequest) AuthService->>Google: Valida ID Token Google-->>AuthService: Dados do usuário AuthService->>UserRepository: GetByEmailAsync(email) alt Usuário existe AuthService->>AuthService: Gera token JWT else Usuário não existe AuthService->>UserRepository: Cria novo usuário AuthService->>AuthService: Gera token JWT end AuthService-->>AuthController: AuthResponseDto AuthController-->>Frontend: 200 OK Frontend-->>Usuário: Redireciona para dashboard

Passo a Passo

  1. Autenticação com Google

    • Usuário clica em "Login com Google"
    • É redirecionado para página de login do Google
    • Após login, Google retorna ID Token para frontend
  2. Requisição ao Backend

    POST /api/auth/google
    {
      "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ij..."
    }
  3. Validação do Token

    var payload = await GoogleJsonWebSignature.ValidateAsync(request.IdToken);
  4. Busca/Criação do Usuário

    var user = await _userRepository.GetByEmailAsync(payload.Email);
    if (user == null)
    {
        user = new User {
            Email = payload.Email,
            Name = payload.Name
        };
        await _userRepository.AddAsync(user);
    }
  5. Geração do Token JWT

    var token = GenerateJwtToken(user);
  6. Resposta

    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "name": "João Silva",
      "email": "usuario@exemplo.com"
    }

Considerações de Segurança

  1. Proteção de Senhas

    • Senhas são armazenadas usando bcrypt
    • Nunca são expostas em logs ou respostas
  2. Validação de Tokens

    • Tokens JWT são assinados com chave secreta
    • Tokens do Google são validados com biblioteca oficial
  3. Proteção contra Ataques

    • Implementado rate limiting
    • Verificação de tentativas de login
    • Bloqueio temporário após várias tentativas falhas

Fluxograma Geral

graph TD A[Início] --> B{Login com} B --> C[E-mail/Senha] B --> D[Google] C --> E[Valida dados] E --> F[Busca usuário] F --> G{Usuário existe?} G -->|Sim| H[Verifica senha] G -->|Não| I[Erro: usuário não encontrado] H --> J{Gera token} D --> K[Valida token Google] K --> L{Busca usuário} L -->|Sim| M[Gera token] L -->|Não| N[Cria novo usuário] N --> M J --> O[Retorna token] M --> O O --> P[Dashboard]

Referências