From 5569c863bfb3796b2c36278ce0482d652d8cf323 Mon Sep 17 00:00:00 2001 From: Rafael Alves Lopes Date: Wed, 27 May 2026 16:41:38 -0300 Subject: [PATCH] Atualizar Auth --- Auth.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/Auth.md b/Auth.md index 36ea8c4..e7d91ae 100644 --- a/Auth.md +++ b/Auth.md @@ -22,6 +22,7 @@ src/modules/auth/ ├── auth.service.ts # Fachada — delega para os providers ├── auth.config.ts # Leitura de variáveis de ambiente ├── auth-token.service.ts # Emissão de JWT da aplicação +├── user-access.service.ts # Sincronização do usuário autenticado com o banco ├── auth.types.ts # Interfaces TypeScript compartilhadas └── providers/ ├── ldap-auth.provider.ts # Autenticação LDAP/AD @@ -91,6 +92,9 @@ Frontend → Se o bind falhar: UnauthorizedException → Busca dados do usuário no diretório (se LDAP_SEARCH_BASE configurado) → Monta objeto AuthenticatedUser + → UserAccessService.syncAuthenticatedUser() + → Cria/atualiza usuarios e usuarios_provedores + → Carrega perfis, areas e area principal → AuthTokenService.issueToken() → Gera JWT assinado com JWT_SECRET → Retorna { token, user } para o frontend @@ -113,6 +117,7 @@ O AD apenas valida a identidade. O JWT emitido é da aplicação, não do AD. → Backend valida o state (assinatura + expiração) → Backend troca o code por access_token (chamada server-to-server) → Backend consulta Microsoft Graph /me para obter dados do usuário + → UserAccessService.syncAuthenticatedUser() sincroniza o usuário no banco → AuthTokenService.issueToken() gera JWT próprio → Backend redireciona para MICROSOFT_SUCCESS_REDIRECT_URL?token=... @@ -148,15 +153,41 @@ Após qualquer autenticação bem-sucedida, o `AuthTokenService` emite um JWT co ```json { - "sub": "identificador-do-usuario", + "sub": "4", "name": "Nome Completo", "email": "usuario@empresa.com", "provider": "ldap", - "username": "usuario" + "username": "usuario", + "perfis": ["Admin"], + "profiles": ["Admin"], + "areas": ["Suporte"], + "areaPrincipal": "Suporte", + "accessStatus": "assigned" } ``` -O `sub` é atualmente o email ou identificador externo. Quando houver banco de dados, deve ser substituído pelo ID interno da tabela `users`. +O `sub` usa o ID interno da tabela `usuarios`, convertido para string. O mesmo ID também é retornado no objeto de usuário como `databaseId`. + +O JWT é emitido e salvo no frontend, mas ainda falta a camada de `AuthGuard` no NestJS para validar o token nas rotas privadas. Portanto, hoje o token representa a sessão do usuário para o frontend, mas o backend ainda precisa ser endurecido para produção. + +--- + +## Sincronização de usuário e acesso + +Após o provedor autenticar o usuário, o `UserAccessService`: + +1. faz upsert em `usuarios` usando email ou fallback `provider:username`; +2. faz upsert em `usuarios_provedores`; +3. consulta perfis em `usuarios_perfis` + `perfis_acesso`; +4. consulta especialidades em `usuarios_areas` + `areas`; +5. retorna o usuário enriquecido com: + - `databaseId`; + - `perfis` / `profiles`; + - `areas`; + - `areaPrincipal`; + - `accessStatus`. + +`accessStatus` fica como `assigned` quando o usuário possui perfil e área. Usuários sem vínculo suficiente entram como `unassigned` e caem na tela de pendência no frontend. --- @@ -251,10 +282,18 @@ loginComNovoProvedor(dados: any) { ## O que ainda falta para produção -- [ ] Tabela `users` no banco de dados -- [ ] Tabela `auth_identities` para vincular provedores externos ao usuário interno -- [ ] `sub` do JWT usando ID interno do banco, não email externo +- [x] Tabela `usuarios` no banco de dados +- [x] Tabela `usuarios_provedores` para vincular provedores externos ao usuário interno +- [x] `sub` do JWT usando ID interno do banco - [ ] Guard NestJS para proteger rotas privadas (`@UseGuards(AuthGuard)`) -- [ ] Roles e permissões +- [ ] Roles e permissões validadas no backend - [ ] Auditoria de login -- [ ] Trocar token na query string por cookie HTTP-only (reduz exposição no browser) \ No newline at end of file +- [ ] Trocar token na query string por cookie HTTP-only (reduz exposição no browser) + +--- + +## Documentacao complementar + +A sincronizacao de usuarios autenticados com o banco, os perfis de acesso, as areas operacionais e os endpoints administrativos estao documentados em: + +- [`access-control.md`](./access-control.md)