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
-
Entrada de Dados
- Usuário insere e-mail e senha no formulário de login
-
Requisição ao Backend
POST /api/auth/login
{
"email": "usuario@exemplo.com",
"password": "senha123"
}
-
Validação
- Verifica se e-mail e senha foram fornecidos
- Valida formato do e-mail
-
Busca do Usuário
var user = await _userRepository.GetByEmailAsync(loginDto.Email);
-
Verificação de Senha
var result = _passwordHasher.VerifyHashedPassword(user, user.PasswordHash, loginDto.Password);
-
Geração do Token JWT
var token = GenerateJwtToken(user);
-
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
-
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
-
Requisição ao Backend
POST /api/auth/google
{
"idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ij..."
}
-
Validação do Token
var payload = await GoogleJsonWebSignature.ValidateAsync(request.IdToken);
-
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);
}
-
Geração do Token JWT
var token = GenerateJwtToken(user);
-
Resposta
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"name": "João Silva",
"email": "usuario@exemplo.com"
}
Considerações de Segurança
-
Proteção de Senhas
- Senhas são armazenadas usando bcrypt
- Nunca são expostas em logs ou respostas
-
Validação de Tokens
- Tokens JWT são assinados com chave secreta
- Tokens do Google são validados com biblioteca oficial
-
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