Skip to content

Autenticação e Segurança

Visão Geral

O SystemClinic utiliza autenticação própria baseada em JWT (JSON Web Tokens) emitidos pela API .NET. Não há dependência de Firebase SDK no frontend — toda a autenticação é gerenciada pela API backend.

Fluxo de Autenticação

Login

1. Usuário envia e-mail e senha → POST /auth/login
2. API valida credenciais (bcrypt)
3. API gera:
   - Access Token (JWT, curta duração)
   - Refresh Token (longa duração, armazenado com hash no banco)
4. Tokens retornados ao frontend
5. Angular armazena tokens em memória (não no localStorage)
6. Interceptor anexa Bearer Token em toda requisição à API

Refresh Automático

O interceptor Angular detecta respostas 401 e automaticamente:

  1. Chama POST /auth/refresh com o Refresh Token
  2. Recebe um novo par de tokens
  3. Repete a requisição original com o novo Access Token

Se o refresh falhar (token expirado ou revogado), o usuário é redirecionado para a tela de login.

Logout

1. Frontend chama POST /auth/logout
2. API revoga o Refresh Token no banco (marca como revogado)
3. Frontend descarta os tokens da memória
4. Usuário é redirecionado para /login

Estrutura do JWT

Claims presentes no Access Token:

ClaimDescriçãoExemplo
subID do usuário"uuid-do-usuario"
orgID da organização"uuid-da-org"
rolePapel do usuário"ADMIN"
unitsIDs das unidades permitidas["uuid1", "uuid2"]
emailE-mail do usuário"user@clinica.com"
iatEmitido em (issued at)Unix timestamp
expExpira em (expiration)Unix timestamp
issEmissor"systemclinic-api"
audAudiência"systemclinic-web"

Recuperação de Senha

1. Usuário acessa /forgot-password e informa o e-mail
2. API gera um reset_token e armazena no Redis com TTL de 1 hora
3. E-mail com link de redefinição é enviado via Resend
4. Usuário clica no link, informar nova senha
5. API valida o token, atualiza o password_hash
6. Todos os refresh tokens do usuário são revogados
7. Usuário é redirecionado para login

Convite de Usuário

1. Admin acessa Usuários → Convidar Usuário
2. Informa e-mail e papel do novo usuário
3. API cria o usuário com flag must_change_password=true
4. Token de convite gerado (Redis, TTL 48h) e e-mail enviado
5. Novo usuário clica no link do convite
6. Página /accept-invite solicita definição de senha
7. API valida o token, define a senha e retorna tokens de sessão

Revogação de Tokens

Tokens são revogados automaticamente em:

  • Logout manual do usuário
  • Alteração de papel (role) por um Admin
  • Inativação do usuário
  • Redefinição de senha

Na próxima requisição com token revogado, a API retorna 401 e o frontend redireciona para login.

Endpoints de Autenticação

MétodoEndpointDescrição
POST/auth/loginLogin com e-mail e senha
POST/auth/refreshRenovar access token
POST/auth/logoutRevogar sessão
POST/auth/forgot-passwordSolicitar redefinição de senha
POST/auth/reset-passwordConfirmar nova senha
POST/auth/accept-inviteAceitar convite de usuário
GET/auth/meRetornar perfil do usuário autenticado

Segurança de Transporte

  • TLS 1.3 obrigatório em produção
  • HSTS ativado com preload
  • Headers de segurança: X-Content-Type-Options, X-Frame-Options, Referrer-Policy
  • CORS: Apenas origens autorizadas (frontend SPA)

Rate Limiting

EndpointLimite
/auth/login10 tentativas/minuto por IP
API autenticada600 req/min por user_id
API pública60 req/min por IP

Respostas com limite excedido retornam 429 Too Many Requests com o header Retry-After.

Firebase Storage

O armazenamento de arquivos usa o Firebase Storage com validação de tenant. Uploads são feitos via API .NET (não diretamente pelo frontend):

  1. Frontend envia o arquivo via multipart para POST /files/upload
  2. API valida o tipo MIME e tamanho (máximo 20 MB)
  3. API faz upload para Firebase Storage no caminho /{orgId}/{context}/{fileName}
  4. API retorna a path do arquivo
  5. Para acesso, o frontend solicita uma Signed URL temporária à API
  6. A URL expira em aproximadamente 1 hora

Arquivos são sempre scoped pelo organizationId, prevenindo acesso cross-tenant.

Desenvolvido com ❤️ pela equipe FastGivr.