Sessão e segurança do navegador
Depois da entrada, o Portal 2 identifica o navegador por uma sessão opaca. O cookie não carrega um access token para o JavaScript ler. O BFF usa esse identificador para recuperar a sessão e mantém os tokens necessários no servidor.
Essa separação reduz a exposição de tokens no navegador e permite que o BFF encerre ou rotacione uma sessão sem depender de dados gravados na interface.
Caminho de uma rota protegida
O authGuard só considera a sessão válida depois que o BFF responde à consulta. O permissionGuard consulta myPermissions e nega o acesso por padrão se não consegue carregar as permissões. Nenhum desses guards torna o frontend uma barreira de segurança: o BFF e os serviços de domínio devem validar o acesso à operação solicitada.
Cookies usados pelo fluxo de navegador
| Cookie | Leitura | Escopo e finalidade | Proteções confirmadas |
|---|---|---|---|
mm_session | BFF; não é legível por JavaScript. | Identifica a sessão opaca do navegador; Path=/. | HttpOnly, expiração, rotação após autenticação e SameSite configurável. Os testes de navegador cobrem SameSite=Lax. |
| CSRF | JavaScript e BFF, quando configurado. | Prova adicional enviada no cabeçalho x-csrf-token nas mutações. | O BFF compara a prova antes de executar a operação. |
O atributo Secure é configurável por ambiente. Em produção, a aplicação deve servir o Portal por HTTPS e configurar cookies seguros. Não use a configuração de desenvolvimento como referência de produção.
O Portal não grava access token, refresh token ou token OAuth em localStorage, sessionStorage, IndexedDB ou na resposta de login. Na inicialização, ele remove o banco IndexedDB legado mm-auth. O navegador mantém somente uma URL interna de retorno em sessionStorage, um identificador de dispositivo em localStorage e o cookie de sessão, que o JavaScript não lê.
safeReturnUrl aceita apenas caminhos internos. Essa regra impede que um parâmetro de retorno transforme o login em um redirecionamento para outro domínio.
Proteções de requisição
| Proteção | Onde é aplicada | O que valida | Falha esperada |
|---|---|---|---|
| Sessão | BffAuthGuard e rotas protegidas. | Presença e validade do cookie de sessão. | 401; o Portal encerra o estado local e volta à entrada. |
| Origem | Rotas REST mutáveis e operações GraphQL. | Origin ou Referer permitido; domínios customizados devem usar HTTPS e corresponder exatamente ao tenant. | 403. |
| CSRF | BrowserCsrfGuard e mutations GraphQL. | Cabeçalho x-csrf-token configurado. | 403 com prova CSRF inválida. |
| CORS | Aplicação BFF. | Origens configuradas e envio de credenciais. | O navegador bloqueia a chamada antes de disponibilizar a resposta à interface. |
| Rate limit | Entrada, MFA e QR Code. | Quantidade de tentativas na janela permitida. | 429. |
O AuthSessionService envia withCredentials: true e x-csrf-token: 1 nas mutações de autenticação. O cliente Apollo segue a mesma política. O Portal não usa Authorization: Bearer como alternativa para chamadas GraphQL de navegador.
Permissões e recursos administrativos
Depois de restaurar a sessão, o Portal consulta permissões efetivas por tenant e unidade. A consulta também informa roleIds e se a pessoa é platformAdmin.
| Guard do frontend | Finalidade de experiência | Fonte de verdade no backend |
|---|---|---|
authGuard | Redireciona quem não tem sessão e preserva a rota interna. | Cookie e sessão validados pelo BFF. |
guestGuard | Evita que uma pessoa autenticada volte à tela pública. | Sessão atual. |
permissionGuard | Oculta ou bloqueia navegação sem permissão. | Serviço de permissões e regra do recurso. |
platformAdminGuard | Protege telas administrativas da plataforma. | Claim e política platformAdmin. |
mfaRequiredGuard | Encaminha quem precisa configurar MFA. | Estado da sessão e política de segurança. |
Uma API administrativa, como o cadastro de cliente OAuth, exige Bearer válido e platformAdmin. Operações de usuários podem exigir user:write. Consulte a referência de clientes OAuth e a referência de usuários antes de chamar essas rotas.
Logout, expiração e revogação
Ao sair, o Portal chama POST /v1/auth/logout com cookie e prova CSRF. A operação é idempotente para a interface: se ela recebe 401 ou 204, limpa seu estado local da mesma forma.
Uma sessão pode expirar, ser revogada ou se tornar inválida depois de uma alteração de segurança. Quando uma chamada protegida retorna 401, o Portal limpa o usuário em memória e retorna à tela de entrada. O BFF também limpa o cookie quando não consegue mais autenticar a sessão.
Caminhos não felizes
| Situação | Efeito no Portal | Como agir |
|---|---|---|
| Cookie ausente, expirado ou revogado | A rota protegida retorna 401 e a pessoa é direcionada à entrada. | Entre novamente. |
| Origin fora da lista permitida | O BFF retorna 403. | Use o domínio oficial ou corrija a configuração do tenant. |
| Cabeçalho CSRF ausente ou incorreto | A mutation retorna 403. | Corrija o cliente; não desative a proteção. |
| Permissões não carregam | O permissionGuard nega a rota. | Verifique a sessão, o tenant e as permissões atribuídas. |
Resposta GraphQL UNAUTHENTICATED | O Portal encerra a sessão local. | Entre novamente e investigue a causa no BFF se o problema persistir. |
Próximos passos
Leia Entrar pelo navegador para o fluxo que cria a sessão. Leia OAuth e OpenID Connect quando o consumidor não é o navegador do Portal.