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

**Documentos deste épico:** [01 - Definição](./01%20-%20Defini%C3%A7%C3%A3o%20v2.0.md) (v2.0) · [02 - Especificação](./02%20-%20Especifica%C3%A7%C3%A3o%20v2.0.md) (v2.0) · Protótipo (Seção 3): **pendente**, ainda não produzido · [04 - Mapeamento de Banco de Dados](./04%20-%20Mapeamento%20de%20Banco%20de%20Dados%20v2.0.md) (v2.0). Este épico faz parte do documento guarda-chuva [Check-in de Usuários](../00%20-%20Guarda-chuva%20v2.9.md).

---

## 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, direciona para a tela de aceite do vínculo (E3), independentemente do número de vínculos ativos. Se não houver, direciona conforme os vínculos ativos (RN-CIU-009):
    - 0 vínculos ativos: página de Meu Perfil com banner MSG-I01
    - 1 vínculo ativo: 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.
    - Múltiplos vínculos ativos: 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ção**|**Valor atual**|
|---|---|---|
|**TamanhoMinimo**|Quantidade mínima de caracteres na senha|8|
|**MinimoCaracterEspecial**|Quantidade mínima de caracteres especiais|1|
|**MinimoLetraMaiuscula**|Quantidade mínima de letras maiúsculas|1|
|**MinimoLetraMinuscula**|Quantidade mínima de letras minúsculas|1|
|**MinimoNumero**|Quantidade mínima de números (dígitos)|1|
|**CaracteresEspeciais**|Caracteres 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 o número de vínculos ativos (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 vínculos ativos, 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 1 vínculo ativo, quando faço login com sucesso, então entro direto na clínica 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 múltiplos vínculos ativos, 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

|**Campo**|**Tela**|**Tipo**|**Obrigatório**|**Formato/Regra**|**Mensagem de erro**|
|---|---|---|---|---|---|
|**Documento (login)**|Login|Texto sem máscara|Sim|Aceita qualquer texto livre — sem validação de formato (RN-CIU-016)|N/A — erro genérico MSG-E01|
|**Senha (login)**|Login|Password|Sim|Não vazio|N/A — erro genérico MSG-E01|
|**Documento (recuperação etapa 1)**|Recuperação Etapa 1|Texto sem máscara|Sim|Aceita 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 2|Texto sem máscara|Sim|Deve ser igual ao documento informado na etapa 1|MSG-E07|
|**Código de recuperação**|Recuperação Etapa 2|Texto numérico|Sim|Exatamente 6 dígitos|MSG-E03|
|**Nova senha**|Recuperação Etapa 2|Password|Sim|TamanhoMinimo (8) + MinimoCaracterEspecial (1) + MinimoLetraMaiuscula (1) + MinimoLetraMinuscula (1) + MinimoNumero (1) + CaracteresEspeciais — todos parametrizados em UsuarioSenhaParametros|Indicador visual de critérios não atendidos|
|**Confirmar senha**|Recuperação Etapa 2|Password|Sim|Deve ser igual ao campo Nova Senha|MSG-E05|

### Mapeamento de Componentes de Interface

|**Componente**|**Variante**|**Estado(s)**|**Tokens aplicados**|**Onde aparece**|
|---|---|---|---|---|
|**Input (text)**|Bordered|default, focus, error, disabled|input-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 toggle|default, focus, error|Mesmos tokens do input text + ícone olho clicável (toggle de visibilidade)|Senha (login), Nova senha, Confirmar senha|
|**Button**|Primary|default, hover, loading, disabled|btn-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)|
|**Button**|Tertiary|default, hover|Transparent bg, primary-pure text (#00E676)|Esqueci minha senha (MSG-B02), Cadastrar-se (MSG-B03), Reenviar código (MSG-B06)|
|**Toast**|Default, Success, Error|animation: 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|
|**Progress**|Linear|default|radius-pill, neutral-lighter track (#E5EAF0), primary-pure bar (#00E676)|Indicador de força de senha|
|**Checkbox**|Default|default, checked, disabled|20px box, primary-pure (#00E676) quando checked|Lista de critérios de complexidade da senha|

### Integração com Backend

#### Autenticação

|**Função**|**Método**|**Path**|**Request Body**|**Response Body**|**Códigos HTTP**|
|---|---|---|---|---|---|
|**Login**|POST|/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 }], convitesPendentes: number }|200 (sucesso), 401 (credenciais inválidas), 423 (bloqueado por tentativas)|
|**Logout**|POST|/api/auth/logout|{ token: string }|{ success: true }|200|

#### Recuperação de Senha

|**Função**|**Método**|**Path**|**Request Body**|**Response Body**|**Códigos HTTP**|
|---|---|---|---|---|---|
|**Solicitar recuperação**|POST|/api/auth/recuperar-senha|{ documento: string }|{ success: true } (sempre retorna sucesso, mesmo se documento não existir)|200|
|**Redefinir senha**|POST|/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).

### 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**

|**ID**|**Contexto**|**pt-BR**|**en-US**|**es-419**|
|---|---|---|---|---|
|**MSG-E01**|Falha de login (qualquer causa)|"Usuário ou senha inválidos."|"Invalid username or password."|"Usuario o contraseña inválidos."|
|**MSG-E02**|Bloqueio 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-E03**|Código de recuperação inválido|"Código inválido."|"Invalid code."|"Código inválido."|
|**MSG-E04**|Có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-E05**|Senhas não coincidem|"As senhas não coincidem."|"Passwords do not match."|"Las contraseñas no coinciden."|
|**MSG-E06**|Nova 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-E07**|Documento 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-E08**|Serviç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**

|**ID**|**Contexto**|**pt-BR**|**en-US**|**es-419**|
|---|---|---|---|---|
|**MSG-S01**|Recuperaçã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-S02**|Senha redefinida|"Senha redefinida com sucesso!"|"Password successfully reset!"|"¡Contraseña restablecida con éxito!"|

**Mensagens informativas**

|**ID**|**Contexto**|**pt-BR**|**en-US**|**es-419**|
|---|---|---|---|---|
|**MSG-I01**|Banner — sem vínculo ativo|"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**

|**ID**|**Campo**|**pt-BR**|**en-US**|**es-419**|
|---|---|---|---|---|
|**MSG-P01**|Campo "Usuário" (login)|"Digite seu login"|"Enter your login"|"Ingrese su login"|
|**MSG-P02**|Campo "Senha" (login)|"Senha"|"Password"|"Contraseña"|
|**MSG-P03**|Campo "Documento" (recuperação etapa 1)|"Digite seu login"|"Enter your login"|"Ingrese su login"|
|**MSG-P04**|Campo "Código" (recuperação etapa 2)|"Código"|"Código"|"Código"|

**Textos orientadores**

|**ID**|**Contexto**|**pt-BR**|**en-US**|**es-419**|
|---|---|---|---|---|
|**MSG-T01**|Recuperaçã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**

|**ID**|**Elemento**|**pt-BR**|**en-US**|**es-419**|
|---|---|---|---|---|
|**MSG-B01**|Botão primário (login)|"Entrar"|"Sign in"|"Ingresar"|
|**MSG-B02**|Link (login)|"Esqueci minha senha"|"Forgot my password"|"Olvidé mi contraseña"|
|**MSG-B03**|Link (login)|"Cadastrar-se"|"Sign up"|"Registrarse"|
|**MSG-B04**|Botão (recuperação etapa 1)|"Enviar código"|"Send code"|"Enviar código"|
|**MSG-B05**|Botão (recuperação etapa 2)|"Redefinir senha"|"Reset password"|"Restablecer contraseña"|
|**MSG-B06**|Link (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.
