# Módulo 15 — SSO oficial e bloqueio de acesso direto indevido

## Diretriz arquitetural preservada
- o **portal** é a entrada oficial do produto;
- o **NVR** continua integrado sob `/nvr`;
- o usuário final abre o produto por **launch assinado** emitido pelo portal;
- o login local permanece apenas como **fallback técnico explícito**.

## Endurecimentos aplicados

### Entrada principal
- `auth_primary_login_path()` devolve o fluxo principal para o portal quando `portal_launch_required()` está ativo;
- `portal_primary_entry_url()` propaga `redirect_to` saneado e `product=nvr`.

### SSO direto
- `/login-central` e `/sso/entrar` deixam de ser entrada principal válida quando o ambiente exige launch do portal;
- o entrypoint central passou a ser lido por `app.sso.central.entrypoint_url`.

### Launch do portal
- `launch.php` prioriza `ticket` temporário e assinado;
- o fallback legado por `token` direto fica bloqueado por padrão;
- falhas de consume são auditadas;
- a promoção para sessão oficial remove marcas de contingência técnica.

### Sessão do workspace
- sessões do usuário final são validadas pelo contexto oficial do portal;
- `/app` e `/cliente` continuam exigindo `EnsurePortalLaunchWorkspace`;
- sessões técnicas locais continuam isoladas da experiência do usuário final.

### Fallback técnico
- `/login-tecnico` e `/entrar-tecnico` continuam disponíveis para contingência administrativa explícita;
- query/body flags frouxas deixam de habilitar o modo técnico;
- o MFA preserva a origem técnica até a conclusão.

## Variáveis relevantes
- `AUTH_PORTAL_LAUNCH_REQUIRED`
- `AUTH_ROOT_REQUIRES_PORTAL_CONTEXT`
- `AUTH_DIRECT_CENTRAL_SSO_DISABLED`
- `AUTH_LAUNCH_TOKEN_FALLBACK_ENABLED`
- `AUTH_WORKSPACE_REQUIRES_PORTAL_LAUNCH`
- `AUTH_ALLOWED_WORKSPACE_LOGIN_ORIGINS`
- `AUTH_TECHNICAL_LOGIN_REDIRECT_PATH`
