Épico 1 — Núcleo de Identidade e Autenticação — Especificação (v2.2)

Documentos deste épico: 01 - Definição (v2.3) · 02 - Especificação (v2.2) · Protótipo (Seção 3): pendente, ainda não produzido · 04 - Mapeamento de Banco de Dados (v2.3). Este épico faz parte do documento guarda-chuva Check-in de Usuários.


SEÇÃO 2 — ESPECIFICAÇÃO

Histórias de Usuário

US-CIU-003 — Login com documento único Como usuário autenticado, quero fazer login com meu CPF e senha, para acessar o sistema e iniciar meu trabalho na clínica.

US-CIU-009 — Recuperação de senha Como usuário que esqueceu a senha, quero recuperá-la via e-mail ou celular com código de verificação, para voltar a acessar o sistema sem precisar de suporte.

Descrição Funcional Detalhada

Tela de Login

Propósito: Autenticar o usuário no sistema via documento único + senha.

Layout (mobile first):

  • Logo do Gemed centralizado no topo
  • Campo de texto “Usuário” — input sem máscara, placeholder MSG-P01
  • Campo de senha “Senha” — input com toggle de visibilidade (ícone olho), placeholder MSG-P02
  • Botão primário “Entrar” (MSG-B01) — largura total, cor primary-pure (#00E676)
  • Link terciário “Esqueci minha senha” (MSG-B02) — abaixo do botão, alinhado ao centro
  • Link terciário “Cadastrar-se” (MSG-B03) — abaixo, alinhado ao centro

Comportamento de campos (RN-CIU-008, transversal): todo campo de input possui um placeholder que é o nome do campo; ao ganhar foco, o placeholder vira label acima do campo. As descrições abaixo não citam o label separadamente — é sempre igual ao placeholder.

Mecanismo de autenticação (detalhe técnico):

  1. O sistema recebe o documento e a senha digitada pelo usuário.
  2. O sistema localiza o registro na tabela Usuario pelo documento informado (considerando apenas registros com RemovidoEm nulo — exclusão lógica, RN-CIU-005).
  3. Se o registro não existe (ou foi excluído logicamente), a autenticação falha com mensagem genérica (RN-CIU-016).
  4. Se o registro existe, o sistema utiliza o Salt armazenado na tabela Usuario para gerar o Hash da senha digitada.
  5. O sistema compara o Hash gerado com o Hash armazenado na tabela Usuario.
  6. Se os hashes coincidem, a autenticação é bem-sucedida.
  7. Se os hashes não coincidem, a autenticação falha com mensagem genérica (RN-CIU-016).

A senha é armazenada exclusivamente como hash + salt — nunca em texto plano. Os campos utilizados na tabela Usuario são Hash (varchar, hash da senha gerado com o salt) e Salt (varchar, valor aleatório único por usuário usado no processo de hashing). Este é o mesmo mecanismo reaproveitado pelo E2 (auto-cadastro) e pelo E3 (conclusão de cadastro por convite) ao autenticar automaticamente o profissional (RN-CIU-022).

Comportamento:

  • O campo de documento aceita qualquer texto de forma livre — letras, números, símbolos, qualquer combinação. Não aplica máscara, não valida formato, não restringe entrada (RN-CIU-016).

  • O botão “Entrar” fica desabilitado (disabled) enquanto ambos os campos estiverem vazios.

  • Ao submeter, o botão exibe estado loading (spinner) e fica desabilitado.

  • Em caso de erro, exibe toast error abaixo do botão “Entrar” com a mensagem MSG-E01.

  • Após atingir o limite de tentativas falhas (parametrizado em QuantidadeTentativas, atualmente 5), exibe toast error MSG-E02 e o botão “Entrar” fica desabilitado pelo período parametrizado.

  • Em caso de sucesso, o sistema primeiro verifica se há convite pendente (convitesPendentes > 0 na resposta do login). Se houver:

    • e o usuário não tiver nenhum vínculo ativo, direciona para a tela cheia de aceite do vínculo (E3, RN-CIU-014) — é o primeiro vínculo desse usuário, e ele ainda não leu as regras básicas de uso;
    • e o usuário já tiver ao menos um vínculo ativo, o roteamento segue normalmente conforme a quantidade de clínicas acessíveis (abaixo), e o convite aparece como card em destaque na tela de seleção de clínica (E6, RN-CIU-025) — inclusive quando o usuário tem acesso a exatamente 1 clínica, caso em que a tela de seleção só é exibida por causa do card.

    Se não houver convite pendente, direciona conforme a quantidade de clínicas acessíveis (RN-CIU-009):

    • 0 clínicas acessíveis (por não ter nenhum vínculo ativo, ou por ter vínculo(s) ativo(s) sem nenhum Perfil de acesso associado a nenhuma clínica): página de Meu Perfil com banner MSG-I01
    • Acesso a exatamente 1 clínica: direto para o cockpit do profissional conforme seu tipo. Se o tipo de profissional não tiver um cockpit específico definido, o sistema carrega apenas o perfil e o menu lateral, sem uma tela ativa.
    • Acesso a mais de 1 clínica: tela de seleção de clínica (E6)

Estados visuais:

  • Default: campos vazios, botão desabilitado
  • Focus: borda do input muda para border-medium (2px) solid neutral-darker (#01013B). Todo texto em edição exibe cor neutral-dark (#012856).
  • Loading: botão com spinner, todos os campos desabilitados
  • Error: toast error exibido abaixo do botão “Entrar”, campos permanecem preenchidos (exceto senha que é limpa)
  • Blocked: botão desabilitado com mensagem de bloqueio temporário

Motivador: a tela de login é minimalista e mobile first porque é a porta de entrada usada diariamente. Campos grandes (input-height: 56px) facilitam o uso no celular. A ausência de máscara e restrição no campo de documento (RN-CIU-016) evita dar pistas a atacantes sobre o formato esperado ou a existência do documento na base. O campo aceita qualquer entrada para não diferenciar “formato inválido” de “documento não encontrado”.

Tela de Recuperação de Senha

Propósito: Permitir que o usuário recupere o acesso via código de verificação enviado por e-mail ou celular.

Fluxo em 2 etapas:

Etapa 1 — Solicitação

  • Campo de documento (input text, sem máscara, sem validação de formato — RN-CIU-016)
  • Texto orientador: MSG-T01
  • Botão “Enviar código” (MSG-B04)
  • Comportamento: ao enviar, o sistema verifica se o documento existe na tabela Usuario (considerando apenas registros com RemovidoEm nulo). Se existe, gera um código de 6 dígitos e envia por e-mail e/ou celular (conforme dados cadastrados na tabela Usuario — campos eMail e Telefone). Se não existe, exibe a mesma mensagem de sucesso para não revelar que o documento não existe: MSG-S01.
  • Após enviar, direciona para a etapa 2

Etapa 2 — Verificação e nova senha

  • Campo de login/documento (input text, sem máscara — o usuário deve reinformar o documento para dupla verificação, garantindo que quem está redefinindo a senha é o mesmo que solicitou o código)
  • Campo de código (input text, 6 dígitos, placeholder MSG-P04)
  • Campo de nova senha (input password, com toggle de visibilidade e indicador de força)
  • Campo de confirmar senha (input password, com toggle de visibilidade)
  • Indicador de força da senha (barra progress que muda de cor: vermelho → amarelo → verde conforme critérios atendidos)
  • Lista de critérios de complexidade (checkbox visuais que marcam automaticamente conforme a senha atende cada critério)
  • Botão “Redefinir senha” (MSG-B05, desabilitado até documento preenchido, código com 6 dígitos, senha válida e confirmação igual)
  • Link “Reenviar código” (MSG-B06)
  • Comportamento: ao redefinir, o sistema valida que o documento informado corresponde ao documento que solicitou o código na etapa 1, valida o código, atualiza Hash + Salt em Usuario, registra a senha anterior em UsuarioSenhaHistorico, exibe toast success MSG-S02 e redireciona para a tela de login
  • Se o documento informado na etapa 2 não corresponder ao documento da etapa 1, exibe toast error MSG-E07

Critérios de complexidade da nova senha — parametrizados via tabela UsuarioSenhaParametros (IpSeguranca), conforme RN-CIU-006 (guarda-chuva):

Parâmetro (campo na tabela)DescriçãoValor atual
TamanhoMinimoQuantidade mínima de caracteres na senha8
MinimoCaracterEspecialQuantidade mínima de caracteres especiais1
MinimoLetraMaiusculaQuantidade mínima de letras maiúsculas1
MinimoLetraMinusculaQuantidade mínima de letras minúsculas1
MinimoNumeroQuantidade mínima de números (dígitos)1
CaracteresEspeciaisCaracteres especiais válidos aceitos!@#$%^&*-_+=?;:|

O sistema consulta estes parâmetros em tempo real ao validar a nova senha. A interface de critérios visuais (checkbox que marcam automaticamente) deve refletir os valores parametrizados — se o administrador alterar MinimoCaracterEspecial para 2, a interface passa a exigir e exibir “2 caracteres especiais”.

Motivador: o fluxo de recuperação não revela se o documento existe (mesma prática do login — RN-CIU-016). O código tem 6 dígitos por ser um padrão familiar (SMS OTP). A etapa 2 exige o campo de login para dupla verificação — garante que quem está redefinindo a senha é o mesmo que solicitou o código, evitando ataques de session hijacking no fluxo de recuperação. A redefinição exige os critérios de complexidade parametrizados na tabela UsuarioSenhaParametros para manter consistência com o auto-cadastro (E2). O histórico de senhas em UsuarioSenhaHistorico permite implementar política de não reutilização de senhas recentes.

Critérios de Aceitação

US-CIU-003 — Login com documento único

CA-003.1: Dado que estou na tela de login, quando informo CPF e senha corretos, então o sistema me autentica e direciona para a próxima tela conforme a quantidade de clínicas acessíveis (Meu Perfil, seleção de clínica ou cockpit do profissional).

CA-003.2: Dado que informei CPF ou senha incorretos, quando submeto, então o sistema exibe a mensagem MSG-E01 sem distinguir qual campo está errado.

CA-003.3: Dado que falhei o número parametrizado de vezes seguidas (QuantidadeTentativas, atualmente 5), quando tento novamente, então o sistema bloqueia pelo período parametrizado (MinutosBloqueado, atualmente 15 minutos) e exibe a mensagem MSG-E02.

CA-003.4: Dado que o bloqueio expirou, quando tento novamente com credenciais corretas, então o sistema me autentica normalmente e zera o contador TentativasLogin.

CA-003.5: Dado que o campo de documento não tem máscara nem validação de formato, quando digito o CPF sem pontos e traços, então o sistema aceita e processa normalmente.

CA-003.6: Dado que tenho 0 clínicas acessíveis — seja porque não tenho nenhum vínculo ativo, seja porque tenho vínculo(s) ativo(s) mas nenhum ainda com Perfil de acesso associado — quando faço login com sucesso, então sou direcionado para a página de Meu Perfil com o banner MSG-I01 visível.

CA-003.7: Dado que tenho acesso a exatamente 1 clínica, quando faço login com sucesso, então entro direto nela e sou direcionado para o cockpit do meu tipo de profissional. Se não houver cockpit específico para meu tipo, o sistema carrega apenas o perfil e o menu lateral, sem tela ativa.

CA-003.8: Dado que tenho acesso a mais de 1 clínica, quando faço login com sucesso, então sou direcionado para a tela de seleção de clínica.

CA-003.9: Dado que o campo RemovidoEm do usuário está preenchido (exclusão lógica), quando tento logar, então o sistema exibe a mensagem MSG-E01 sem revelar que o usuário foi excluído.

CA-003.10: Dado que o toast error aparece abaixo do botão “Entrar”, quando informo credenciais inválidas, então o toast é exibido na posição abaixo do botão, não no topo da tela.

US-CIU-009 — Recuperação de senha

CA-009.1: Dado que informei um documento cadastrado (RemovidoEm nulo), quando solicito recuperação, então recebo um código de 6 dígitos por e-mail ou celular.

CA-009.2: Dado que informei um documento não cadastrado, quando solicito recuperação, então o sistema exibe a mensagem MSG-S01 (sem revelar que não existe).

CA-009.3: Dado que recebi o código, quando informo o documento novamente na etapa 2, o código correto dentro do prazo de validade e uma nova senha que atende todos os critérios parametrizados em UsuarioSenhaParametros, então a senha é redefinida, o registro é salvo em UsuarioSenhaHistorico e posso fazer login com a nova senha.

CA-009.4: Dado que informei um código incorreto, quando tento redefinir, então o sistema exibe a mensagem MSG-E03 e não redefine a senha.

CA-009.5: Dado que informei uma senha que não atende os critérios de complexidade parametrizados em UsuarioSenhaParametros, quando tento redefinir, então o botão “Redefinir senha” permanece desabilitado.

CA-009.6: Dado que informei senhas diferentes nos campos “nova senha” e “confirmar senha”, quando saio do campo, então o sistema exibe a mensagem MSG-E05.

CA-009.7: Dado que o código de recuperação expirou (prazo parametrizado em MinutosValidadeNovaSolicitacao, atualmente 15 minutos), quando tento redefinir, então o sistema exibe a mensagem MSG-E04.

CA-009.8: Dado que QuantidadeMemoria está parametrizado (atualmente 7), quando tento redefinir com uma senha igual a uma das últimas 7 senhas armazenadas em UsuarioSenhaHistorico, então o sistema exibe a mensagem MSG-E06.

CA-009.9: Dado que QuantidadeMemoria está definido como 0, quando redefino a senha, então o sistema não armazena histórico em UsuarioSenhaHistorico e não valida senhas anteriores — qualquer senha que atenda os critérios de complexidade é aceita.

CA-009.10: Dado que informei um documento diferente na etapa 2 daquele informado na etapa 1, quando tento redefinir, então o sistema exibe a mensagem MSG-E07 e não redefine a senha.

Fluxos de Exceção

EX-E1-01 — Serviço de autenticação indisponível Gatilho: back-end de autenticação não responde. Comportamento: toast error MSG-E08 exibido abaixo do botão “Entrar”. Botão volta ao estado default. Recuperação: usuário tenta novamente após alguns instantes.

EX-E1-02 — Código de recuperação expirado Gatilho: usuário informa código de recuperação após o prazo de validade parametrizado em MinutosValidadeNovaSolicitacao (atualmente 15 minutos). Comportamento: mensagem inline MSG-E04. Recuperação: usuário clica em “Reenviar código” (MSG-B06) e recebe um novo.

EX-E1-03 — Usuário com exclusão lógica (RemovidoEm preenchido) Gatilho: usuário tenta logar mas o campo RemovidoEm na tabela Usuario está preenchido (registro excluído logicamente). Comportamento: mensagem genérica MSG-E01 (não revela que o usuário foi excluído — RN-CIU-016). Recuperação: usuário deve contatar o suporte Gemed ou o administrador da clínica.

EX-E1-04 — Nova senha igual a senha recente Gatilho: usuário tenta redefinir senha com um valor igual a uma das últimas senhas armazenadas em UsuarioSenhaHistorico (quantidade controlada por QuantidadeMemoria). Comportamento: toast error MSG-E06. Recuperação: usuário define uma senha diferente que atenda os critérios de complexidade.

EX-E1-05 — Caractere especial não permitido Gatilho: usuário utiliza um caractere especial que não está na lista parametrizada em CaracteresEspeciais. Comportamento: o critério “Caracteres especiais” na lista visual não é marcado como atendido, e o botão “Redefinir senha” permanece desabilitado. Recuperação: usuário utiliza apenas caracteres da lista parametrizada (atualmente: !@#$%

EX-E1-06 — Documento divergente na etapa 2 de recuperação Gatilho: usuário informa um documento na etapa 2 diferente do documento informado na etapa 1 da recuperação de senha. Comportamento: toast error MSG-E07. Botão “Redefinir senha” permanece desabilitado. Recuperação: usuário informa o mesmo documento utilizado na etapa 1.

Validações de Campos

CampoTelaTipoObrigatórioFormato/RegraMensagem de erro
Documento (login)LoginTexto sem máscaraSimAceita qualquer texto livre — sem validação de formato (RN-CIU-016)N/A — erro genérico MSG-E01
Senha (login)LoginPasswordSimNão vazioN/A — erro genérico MSG-E01
Documento (recuperação etapa 1)Recuperação Etapa 1Texto sem máscaraSimAceita qualquer texto livre — sem validação de formato (RN-CIU-016)N/A — mensagem genérica MSG-S01
Documento (recuperação etapa 2)Recuperação Etapa 2Texto sem máscaraSimDeve ser igual ao documento informado na etapa 1MSG-E07
Código de recuperaçãoRecuperação Etapa 2Texto numéricoSimExatamente 6 dígitosMSG-E03
Nova senhaRecuperação Etapa 2PasswordSimTamanhoMinimo (8) + MinimoCaracterEspecial (1) + MinimoLetraMaiuscula (1) + MinimoLetraMinuscula (1) + MinimoNumero (1) + CaracteresEspeciais — todos parametrizados em UsuarioSenhaParametrosIndicador visual de critérios não atendidos
Confirmar senhaRecuperação Etapa 2PasswordSimDeve ser igual ao campo Nova SenhaMSG-E05

Mapeamento de Componentes de Interface

ComponenteVarianteEstado(s)Tokens aplicadosOnde aparece
Input (text)Bordereddefault, focus, error, disabledinput-height: 56px, radius-m (8px), neutral-light border (#BECADC), neutral-darker focus border (#01013B), texto em edição neutral-dark (#012856)Documento (login), Documento (recuperação etapa 1 e 2), Código
Input (password)Bordered com toggledefault, focus, errorMesmos tokens do input text + ícone olho clicável (toggle de visibilidade)Senha (login), Nova senha, Confirmar senha
ButtonPrimarydefault, hover, loading, disabledbtn-height: 40px, primary-pure bg (#00E676), base-pure text (#FFFFFF), radius-m (8px)Entrar (MSG-B01), Enviar código (MSG-B04), Redefinir senha (MSG-B05)
ButtonTertiarydefault, hoverTransparent bg, primary-pure text (#00E676)Esqueci minha senha (MSG-B02), Cadastrar-se (MSG-B03), Reenviar código (MSG-B06)
ToastDefault, Success, Erroranimation: toast-in (300ms)neutral-dark bg (#012856) / secondary-dark bg (#0091EA) / error-pure bg (#F44336)Feedback de login (abaixo do botão “Entrar”), recuperação, bloqueio
ProgressLineardefaultradius-pill, neutral-lighter track (#E5EAF0), primary-pure bar (#00E676)Indicador de força de senha
CheckboxDefaultdefault, checked, disabled20px box, primary-pure (#00E676) quando checkedLista de critérios de complexidade da senha

Integração com Backend

Autenticação

FunçãoMétodoPathRequest BodyResponse BodyCódigos HTTP
LoginPOST/api/auth/login{ documento: string, senha: string }{ token: string, usuario: { id: uuid, nome: string, apelido: string, caminhoFoto: string }, vinculos: [{ clienteBDId: uuid, clienteNome: string, clienteLogo: string, situacao: string }], clinicasAcessiveis: [{ clienteEmpresaId: uuid, clienteBDId: uuid, nome: string, caminhoLogo: string }], convitesPendentes: number }200 (sucesso), 401 (credenciais inválidas), 423 (bloqueado por tentativas)
LogoutPOST/api/auth/logout{ token: string }{ success: true }200

Recuperação de Senha

FunçãoMétodoPathRequest BodyResponse BodyCódigos HTTP
Solicitar recuperaçãoPOST/api/auth/recuperar-senha{ documento: string }{ success: true } (sempre retorna sucesso, mesmo se documento não existir)200
Redefinir senhaPOST/api/auth/redefinir-senha{ documento: string, codigo: string, novaSenha: string }{ success: true }200 (sucesso), 400 (código inválido, código expirado, documento divergente, senha reutilizada, critérios não atendidos)

O mapeamento das tabelas consultadas por estes endpoints está na Seção 4 (Mapeamento de Banco de Dados), não repetido aqui (Lição #10 da Skill Designer).

Nota sobre convitesPendentes: este campo é sempre um número (contagem de convites pendentes do usuário) — o front-end só precisa saber se existe ao menos um, para decidir o desvio de roteamento (acima). A lista completa de convites pendentes, com os dados necessários para exibir os cards na tela de seleção de clínica, é responsabilidade do E6 (GET .../clinic-selection, campo convites, com nome propositalmente diferente para não colidir com este campo numérico — ver 02 - Especificação do E6, “Integração com Backend”).

Catálogo de Mensagens do Sistema e Termos de Interface (i18n)

Todas as mensagens exibidas ao usuário neste épico, com suas traduções para os três idiomas suportados (RN-CIU-007, transversal). As mensagens inline no documento (acima) referenciam os IDs desta seção.

Mensagens de erro

IDContextopt-BRen-USes-419
MSG-E01Falha de login (qualquer causa)“Usuário ou senha inválidos.""Invalid username or password.""Usuario o contraseña inválidos.”
MSG-E02Bloqueio por tentativas”Muitas tentativas. Tente novamente em [X] minutos.""Too many attempts. Try again in [X] minutes.""Demasiados intentos. Inténtelo de nuevo en [X] minutos.”
MSG-E03Código de recuperação inválido”Código inválido.""Invalid code.""Código inválido.”
MSG-E04Código de recuperação expirado”Código expirado. Solicite um novo código.""Code expired. Request a new code.""Código expirado. Solicite un nuevo código.”
MSG-E05Senhas não coincidem”As senhas não coincidem.""Passwords do not match.""Las contraseñas no coinciden.”
MSG-E06Nova senha igual a recente”A nova senha não pode ser igual a uma senha utilizada recentemente.""The new password cannot be the same as a recently used password.""La nueva contraseña no puede ser igual a una contraseña utilizada recientemente.”
MSG-E07Documento divergente na etapa 2”Documento não corresponde ao informado na solicitação.""Document does not match the one provided in the request.""El documento no coincide con el informado en la solicitud.”
MSG-E08Serviço indisponível”Não foi possível conectar ao servidor. Tente novamente em alguns instantes.""Could not connect to the server. Please try again in a few moments.""No fue posible conectar al servidor. Inténtelo de nuevo en unos momentos.”

Mensagens de sucesso

IDContextopt-BRen-USes-419
MSG-S01Recuperação solicitada (sempre exibida, mesmo se documento não existe)“Se o documento estiver cadastrado, você receberá um código de verificação.""If the document is registered, you will receive a verification code.""Si el documento está registrado, recibirá un código de verificación.”
MSG-S02Senha redefinida”Senha redefinida com sucesso!""Password successfully reset!""¡Contraseña restablecida con éxito!”

Mensagens informativas

IDContextopt-BRen-USes-419
MSG-I01Banner — sem clínica acessível”Você não está vinculado a nenhuma clínica ativa. Aguarde um convite ou entre em contato com o administrador da clínica onde você trabalha.""You are not linked to any active clinic. Wait for an invitation or contact the administrator of the clinic where you work.""No está vinculado a ninguna clínica activa. Espere una invitación o comuníquese con el administrador de la clínica donde trabaja.”

Placeholders

IDCampopt-BRen-USes-419
MSG-P01Campo “Usuário” (login)“Digite seu login""Enter your login""Ingrese su login”
MSG-P02Campo “Senha” (login)“Senha""Password""Contraseña”
MSG-P03Campo “Documento” (recuperação etapa 1)“Digite seu login""Enter your login""Ingrese su login”
MSG-P04Campo “Código” (recuperação etapa 2)“Código""Código""Código”

Textos orientadores

IDContextopt-BRen-USes-419
MSG-T01Recuperação — texto orientador etapa 1”Informe seu login. Enviaremos um código de verificação para o e-mail ou celular cadastrado.""Enter your login. We will send a verification code to your registered email or phone.""Ingrese su login. Enviaremos un código de verificación a su correo electrónico o teléfono registrado.”

Rótulos de botões e links

IDElementopt-BRen-USes-419
MSG-B01Botão primário (login)“Entrar""Sign in""Ingresar”
MSG-B02Link (login)“Esqueci minha senha""Forgot my password""Olvidé mi contraseña”
MSG-B03Link (login)“Cadastrar-se""Sign up""Registrarse”
MSG-B04Botão (recuperação etapa 1)“Enviar código""Send code""Enviar código”
MSG-B05Botão (recuperação etapa 2)“Redefinir senha""Reset password""Restablecer contraseña”
MSG-B06Link (recuperação etapa 2)“Reenviar código""Resend code""Reenviar código”

Conformidade SBIS (detalhamento)

NGS1.02.01 — Método de autenticação (estágio 1, obrigatório) — autenticação por documento único + senha, validada exclusivamente no servidor (Mecanismo de autenticação, acima); o cliente nunca decide sozinho se as credenciais são válidas.

NGS1.02.02 — Proteção dos parâmetros de autenticação (estágio 1, obrigatório) — a senha nunca é armazenada em texto plano: apenas Hash + Salt (Mecanismo de autenticação, acima), com salt único por usuário.

NGS1.02.03 — Qualidade da senha (estágio 1, obrigatório) — critérios de complexidade parametrizados em UsuarioSenhaParametros (TamanhoMinimo, MinimoCaracterEspecial, MinimoLetraMaiuscula, MinimoLetraMinuscula, MinimoNumero), que atendem e superam o mínimo exigido (8 caracteres, 1 alfabético, 1 numérico).

NGS1.02.11 — Igualdade de senhas (estágio 1, obrigatório) — QuantidadeMemoria (UsuarioSenhaParametros) impede reutilizar uma das últimas N senhas, verificado contra UsuarioSenhaHistorico na redefinição (EX-E1-04).

NGS1.02.12 — Obtenção de nova senha (estágio 1, obrigatório) — link “Esqueci minha senha” (MSG-B02) na tela de login, levando ao fluxo de recuperação em 2 etapas.

NGS1.02.13 — Controle de tentativas de login (estágio 1, obrigatório) — bloqueio parametrizado (QuantidadeTentativas, atualmente 5, dentro do limite ≤10 exigido) por período parametrizado (MinutosBloqueado, RN-CIU-010).

NGS1.02.16 — Informações em autenticação inválida (estágio 1, obrigatório) — mensagem genérica MSG-E01 para qualquer causa de falha, sem revelar qual campo está incorreto ou se o usuário existe (RN-CIU-016).

NGS1.02.17 — Revelação de credenciais (estágio 1, obrigatório) — campo de senha com máscara de caracteres e toggle de visibilidade; o formulário não memoriza nem exibe credenciais digitadas anteriormente.

NGS1.02.19 — Uso de SALT (estágio 2, recomendado) — salt aleatório único gerado por usuário (Mecanismo de autenticação, acima).

ECF.17.19 — Mensagens do sistema (estágio 1, obrigatório) — todas as mensagens exibidas ao usuário estão catalogadas acima em linguagem não técnica, em português do Brasil, com suporte multilíngue para en-US e es-419. Mensagens técnicas de banco de dados, infraestrutura ou componentes de segurança são capturadas pelo back-end e nunca exibidas ao usuário.


Histórico de Versões

  • v1.0 a v1.9 (07/08/2026 a 27/08/2026) — histórico completo preservado no documento original legado (CIU-E1) Identidade e autenticação v1.9.md, arquivado em Histórico/.
  • v2.0 (30/08/2026) — Arquivo criado pela reconstrução do documento único (CIU-E1) Identidade e autenticação v1.9.md no modelo padrão Seção 1-4 (ver 01-Definição, Histórico de Versões, para o detalhamento completo da reorganização). Nesta seção especificamente: Fluxos de Exceção renumerados de “EX-E1.0X” para “EX-E1-0X”; Conformidade SBIS expandida com o detalhamento de todos os 9 requisitos NGS1.02.XX/ECF.17.19 identificados na Seção 1 (antes só ECF.17.19 tinha “como atendido” documentado — os demais só apareciam listados, sem detalhe, na tabela de SBIS do guarda-chuva); nenhuma regra de negócio, critério de aceitação ou fluxo de exceção teve seu conteúdo alterado.
  • v2.1 (14/09/2026) — corrigido o roteamento pós-login (Fluxo de Login, CA-003.1/003.7/003.8) e o payload de /api/auth/login (Integração com Backend): a decisão entre cockpit direto e tela de seleção de clínica passa a considerar a quantidade de clínicas (ClienteEmpresa) acessíveis, não a quantidade de vínculos — ver RN-CIU-009 (Seção 1) para a definição completa. Adicionado o campo clinicasAcessiveis à resposta do login.
  • v2.2 (14/09/2026) — três correções sobre a v2.1: (1) o desvio de roteamento por convite pendente afirmava direcionar sempre para a tela cheia de aceite do E3 “independentemente da quantidade de clínicas acessíveis” — incorreto e contraditório com o E3 (RN-CIU-014/CA-005.4, tela cheia só para quem não tem nenhum vínculo ativo) e o E6 (CA-007.4, quem já tem 1 vínculo ativo com convite pendente vai ao E6, não ao E3); o critério certo é a quantidade de vínculos ativos (0 → tela cheia do E3; 1+ → card no E6), não de clínicas acessíveis — bullet de Comportamento e CA-003.1 reescritos; (2) CA-003.6 e a bullet de roteamento generalizados de “0 vínculos ativos” para “0 clínicas acessíveis” (que também pode ocorrer com vínculo ativo sem Perfil de acesso associado — RN-CIU-009, Seção 1) — mesmo destino já documentado (Meu Perfil, MSG-I01), reaproveitado, sem novo destino criado; MSG-I01 renomeada de “sem vínculo ativo” para “sem clínica acessível” para não sugerir que só a ausência de vínculo leva a essa tela; (3) adicionada nota explícita, em Integração com Backend, esclarecendo que convitesPendentes é sempre number neste endpoint — o E6 usa um campo de nome diferente (convites) para a lista completa, evitando a ambiguidade de tipo que existia entre os dois documentos.