Autenticação sem password
O FIRO opta deliberadamente por mecanismos de autenticação que não passam por passwords:
Magic link
- Utilizador insere o email; recebe link único.
- Token gerado, hash guardado em base, com expiração.
- Tentativas de uso registam IP e user agent.
- Após uso, token é invalidado.
Google OAuth
Alternativa para todos os fluxos (user, staff, customer, admin). Reaproveita a segurança da conta Google do utilizador.
Vantagens
- Sem passwords reutilizadas em vários serviços.
- Sem ataques de credential stuffing eficazes.
- Sem reset-de-password em massa quando há fugas em outras plataformas.
Tokens e dados sensíveis cifrados
Tudo o que é sensível é cifrado em base de dados via Laravel encryption (protected $casts = ['... ' => 'encrypted']):
- Tokens OAuth Google Calendar (
refresh_token,access_token) — cifrados. - Magic link tokens — guardados como hash, nunca em claro.
- Passwords (quando existem em fluxos opcionais) — bcrypt nativo do Laravel.
A chave de cifragem está fora da base, no APP_KEY do ambiente. Quem só tem acesso ao backup da BD não consegue ler tokens.
Isolamento multi-tenant
A separação entre tenants é feita em três camadas defensivas:
- Middleware
tenant.active— resolve o tenant do request a partir do domínio antes de qualquer controller correr. - Global Scope
TenantScope— aplicado automaticamente a queries Eloquent de models tenant-scoped, garantindo que nunca uma query devolve dados de outro tenant. - Verificações explícitas em controllers — para operações sensíveis, validação adicional de ownership.
Customer e magic links são modelos globais — mas marcações, transações, notas, transações são tenant-scoped por design.
Audit trail completo
O sistema mantém histórico de mudanças em três modelos críticos:
BookingChangeLog— todas as alterações em marcações: quem, o quê, quando.CustomerAuditLog— alterações em dados de cliente (campos antes/depois).NotificationLog— todos os emails e SMS enviados, com estado e erros.
Este trail resolve litígios típicos:
- "O meu telefone foi alterado, quem fez?"
- "A marcação foi cancelada por mim?"
- "O cliente diz que não recebeu o lembrete."
Rate limiting e protecções
Endpoints sensíveis têm throttle aplicado:
- Verificação de slug no signup (
throttle:60,1) — 60 req/min por IP. - Magic link — limites no envio para evitar spam.
- Verificação de PIN — limites no número de tentativas.
Validação de input
- Form Requests para validar todas as mutações.
- Eloquent / Query Builder em vez de SQL raw — protecção contra injection.
- Escape automático em Blade — protecção contra XSS.
- CSRF token em todas as mutações via formulário.
SecurityAlert e detecção de anomalias
O modelo SecurityAlert regista eventos potencialmente suspeitos para revisão da administração da plataforma. Casos típicos:
- Tentativas de login com IP inesperado.
- Erros 500 em rotas críticas.
- Padrões anormais de tráfego.
Os alertas alimentam o dashboard de admin para acção rápida.
RGPD: direitos do titular dos dados
O FIRO suporta os direitos básicos de RGPD via GdprRequest + GdprController:
Direito de acesso (exportação)
- Cliente abre o pedido pelo portal
/minha-conta. - Sistema produz um pacote com perfil + marcações + transações + comunicação.
- Endpoint
/gdpr/exportentrega o pacote.
Direito ao apagamento
- Cliente pede via portal.
- Após confirmação, dados são apagados (hard delete).
- Histórico anonimizado mantém-se onde necessário para integridade contabilística.
Outros direitos
Direito de rectificação é coberto pela edição directa no portal /minha-conta (perfil) e via backoffice do tenant. Consentimento de marketing é explícito e revogável.
Práticas internas: secrets e logs
Conformidade não é só um modelo de dados; é prática:
- Secrets apenas em variáveis de ambiente, nunca em código.
- Passwords nunca registadas em logs.
- Mensagens de erro ao utilizador não expõem internals (stacktrace, queries).
- Erros 500 são capturados em
SecurityAlertmas o utilizador vê uma mensagem amigável.
O que dizer ao lead
Para clientes maiores ou em saúde/clínica, segurança é deal-breaker. Para os mais pequenos, é confiança. Sabe distinguir o tom.
- "Sem passwords para esquecer" — magic link funciona como Notion, Linear, Vercel. Para quem usa Excel + WhatsApp, é uma actualização.
- "Para clínicas e estética: temos audit trail" — quando o lead pergunta "e se alguém alterar dados?", abres a discussão.
- "RGPD não é só o aviso de cookies" — o portal do cliente tem export e delete reais. A maioria das ferramentas só tem boas intenções.
- "Tokens cifrados em base" — para o lead técnico ou para o IT do cliente, é o detalhe que assina.
Âmbito atual & roadmap
O produto evolui semana a semana. Aqui está o que existe hoje e o que está confirmado para chegar.
Hoje no produto
- Magic link sem password (com expiração e log de IP)
- Google OAuth multi-fluxo
- Tokens cifrados em base via Laravel encryption
- Isolamento multi-tenant em 3 camadas
- Audit trail (booking, customer, notification)
- Rate limiting e validação contra injection/XSS
- GDPR export e delete via portal
- SecurityAlert para anomalias
A caminho
- 2FA opcional (TOTP / WebAuthn) para roles owner/manager
- SSO empresarial (SAML / OIDC) em planos enterprise
- Logs de acesso detalhados (quem leu o quê)
- Política de password complexa quando opcionalmente activada
Perguntas frequentes
O FIRO está em conformidade com o RGPD?
Sim: cifragem de dados sensíveis, audit trail, endpoints de export e delete via portal do cliente, consentimento explícito de marketing. O cumprimento contínuo depende também das práticas do tenant na operação dos seus dados.
Tem 2FA?
Hoje não está como feature standalone — o magic link já elimina parte do risco que o 2FA cobre. 2FA com TOTP/WebAuthn está no roadmap para roles owner/manager.
Como sei que outro tenant não vê os meus dados?
Há três camadas de defesa: middleware que resolve o tenant antes de qualquer query, global scope que filtra automaticamente queries Eloquent, e verificações explícitas em operações sensíveis.
Posso restringir o acesso a IPs específicos?
Hoje não como feature — está em avaliação para roadmap em planos superiores.
Onde estão os servidores?
Infraestrutura em Europa, com Cloudflare como camada de edge. Para detalhes específicos pedidos por compliance, falar com [email protected].
Continua à conversa com a equipa comercial
Mostramos o produto a funcionar, respondemos a dúvidas específicas do teu negócio e ajudamos-te a escolher o plano certo.