-
-
Notifications
You must be signed in to change notification settings - Fork 0
Links de email publicos multi tenant
Documentação técnica do fluxo de montagem de URLs públicas enviadas por e-mail nos serviços de verificação de conta e recuperação de senha do módulo api-platform-users.
Em ambientes multi-tenant / white-label (ex.: app.lave-go.com), o e-mail de confirmação de cadastro (/confirm-account?hash=...&token=...) e o de redefinição de senha (/reset-password?...) devem apontar para o domínio do frontend do tenant, não para o host genérico da API (api.controleonline.com).
Antes da correção, a resolução de URL pública priorizava variáveis de ambiente globais (PUBLIC_APP_DOMAIN, MANAGER_APP, etc.), o que fazia com que tenants em produção recebessem links apontando para o domínio errado.
- O link deve ser navegável pelo usuário final no domínio do app do tenant (frontend).
- O domínio do tenant é obtido a partir da requisição atual (header
app-domain,Origin,Referer, host, etc.) viaDomainService. - Variáveis de ambiente de domínio configurado são fallback, nunca a fonte primária quando existe domínio de requisição válido.
- Se o domínio resolvido parecer host de API (
api.controleonline.comou prefixoapi.), e existir um domínio de frontend configurado que não seja API, prefere-se o frontend. - Fallback final de segurança:
admin.controleonline.comse nada for resolvido. - A mesma lógica de resolução é usada por:
-
AccountVerificationService(confirmação de conta) -
PasswordRecoveryService(recuperação de senha)
-
| Serviço | Método principal | Arquivo |
|---|---|---|
| Confirmação de conta |
buildVerificationUrl → resolvePublicAppUrl
|
src/Service/AccountVerificationService.php |
| Recuperação de senha |
buildRecoveryUrl → resolvePublicAppUrl
|
src/Service/PasswordRecoveryService.php |
| Resolução de domínio da requisição |
getDomain / resolveRequestDomain
|
api-platform-common → src/Service/DomainService.php
|
- Domínio da requisição atual (
DomainService::getDomain()— headerapp-domain, Origin, Referer, path, host). - Domínio configurado via ENV /
$_SERVER/getenv(PUBLIC_APP_DOMAIN,MANAGER_APP,APP_DOMAIN,ADMIN_APP_DOMAIN). - Se o domínio obtido parecer host de API e existir domínio configurado de frontend, usa o configurado.
- Se vazio:
admin.controleonline.com. - Garante esquema
https://(ouhttp://se já presente) e remove barra final.
private function looksLikeApiHost(string $domain): bool
{
// normaliza host e verifica api.controleonline.com ou prefixo "api."
}| Visão | Papel deste fluxo |
|---|---|
| SHOP / DELIVERY / SERVICE / POS (white-label) | O frontend do tenant é a origem da requisição; o e-mail deve voltar para o mesmo domínio. |
| MANAGER / CRM / ADMIN | Podem usar domínio configurado global ou do tenant logado. |
| API | Nunca deve ser o destino do link do e-mail (o usuário final não autentica na API). |
O módulo não decide o layout do e-mail nem a tela de confirmação no frontend; apenas monta a URL base + query string. A rota /confirm-account e /reset-password devem existir no frontend do tenant.
-
Entrada: usuário (
User), e-mail destinatário, hash/token gerados. -
Saída: e-mail enviado via
EmailServicecom HTML contendo o link absoluto. -
Dependência transversal:
DomainService(api-platform-common) e cabeçalhos de tenant propagados pela camada de API/gateway. -
Configuração: variáveis
PUBLIC_APP_DOMAIN/MANAGER_APP/APP_DOMAIN/ADMIN_APP_DOMAINcontinuam úteis como fallback e para ambientes sem contexto de request (CLI, jobs).
| Sintoma | Causa provável | Ação |
|---|---|---|
Link aponta para api.controleonline.com
|
Request sem app-domain / Origin / Referer e ENV aponta para API, ou lógica antiga priorizando ENV |
Garantir que a chamada de envio de e-mail ocorra em request com contexto do tenant; verificar deploy da correção em AccountVerificationService / PasswordRecoveryService
|
| Link aponta para domínio genérico errado | ENV global sobrescrevendo tenant | Após a correção, request domain tem prioridade; validar header app-domain no proxy/gateway |
| Link sem esquema ou com barra final | Resolução incompleta | A função normaliza esquema e remove trailing slash |
- Issues: app-community#323 (redefinição de senha), app-community#324 (confirmação de conta)
- Branch de correção:
task-323emapi-platform-users - Commit de referência (preferência de request domain):
fix: prefer request domain for password recovery and account verification links
| Módulo | Relação |
|---|---|
| api-platform-common |
DomainService (fonte do domínio da requisição) |
| api-platform-users | Serviços de verificação e recuperação |
| app-community / frontends white-label | Rotas /confirm-account e /reset-password no SPA |
| api-community | Home da API (fluxos transversais de autenticação) |
- 2026-08-06: Documentação inicial após correção de prioridade request domain vs ENV (issues #323 / #324).