Login com Email/Senha

Por

em


Esse documento descreve os fluxos de dados necessários para contemplar a implementação do login com e-mail e senha do CNN ID. A base que serve de inspiração para o projeto se encontra no seguinte figma (não é o layout/ux final, é apenas uma POC para inspirar o desenvolvimento)

Para contemplar esse tipo de autenticação, precisaremos de, pelo menos, três fluxos diferentes para serem trabalhados. O primeiro é o principal, trata-se do próprio login com criação amigável de conta; em seguida, precisaremos de um fluxo que permita que o sistema confirme o endereço de e-mail fornecido na criação da conta; e por fim, será necessário um fluxo que permita que o usuário reset a própria senha.


Fluxo de Login e Criação de conta amigável:

---
config:
  layout: elk
  look: neo
  theme: default
---
flowchart TB

 subgraph s1["Criação de conta"]
        n10["Senha
Confirmação de senha"] n12["Envio de dados e confirmação de email"] n15["Email"] n16["Mensagem de sucesso + informação de confirmação de email"] end subgraph s2["Login"] n1(["Login"]) n2["Email"] n3["Email existe no cnn id"] n4["Senha"] n5["Email e senha corretos"] n6["Gerar token da sessão + dados do usuário"] n9["Erro de login"] n13["Email validado"] n14["Erro de login + botão Reenviar email de validação"] end n1 --> n2 n2 --> n3 n3 -- SIM --> n4 n4 --> n5 n5 -- NÃO --> n9 n9 --> n2 n5 -- SIM --> n13 n13 -- SIM --> n6 n13 -- NÃO --> n14 n3 -- NÃO --> n15 n15 --> n10 n10 --> n12 n12 --> n16 n10@{ shape: manual-input} n12@{ shape: subproc} n15@{ shape: out-in} n16@{ shape: display} n2@{ shape: manual-input} n3@{ shape: decision} n4@{ shape: manual-input} n5@{ shape: decision} n6@{ shape: display} n9@{ shape: display} n13@{ shape: decision} n14@{ shape: display} style n6 stroke:#00C853 style n9 stroke:#D50000 style n14 stroke:#D50000
Fluxo de login
sequenceDiagram
  actor A1 as User
  participant P1 as CNN ID - Frontend
  participant P2 as CNN ID - Backend
  participant P3 as Firebase - Auth/Admin
  A1->>P1: Prompta login com email
  P1->>P2: GET /email-existe
  P2->>P3: Lista usuário com email
  P3->>P2: Usuário
  P2->>P1: Usuário
  P1->>A1: Solicita senha
  A1->>P1: Prompta senha
  P1->>P2: POST /login
  P2->>P3: autentica com email/senha
  P3->>P2: Dados do usuário
  P2->>P1: Dados do usuário
  P1->>A1: Guarda dados do usuário

Para o login acontecer pelo backend do CNN ID é necessário consumir a API REST do firebase auth. Essa API irá tentar autenticar o e-mail e a senha enviados. Quando com sucesso, o retorno é os dados do usuário e o token de autenticação.

Os possíveis erros que essa API pode retornar são
EMAIL_NOT_FOUND:O email enviado não corresponde a nenhuma conta registrada.
INVALID_PASSWORD:A senha está errada.
USER_DISABLED:O usuário foi desabilitado pelo ADMIN.
Fluxo de cadastro de usuário:
sequenceDiagram
  actor A1 as User
  participant P1 as CNN ID - Frontend
  participant P2 as CNN ID - Backend
  participant P3 as Firebase - Auth/Admin
  A1->>P1: Prompta login com email
  P1->>P2: GET /email-existe
  P2->>P3: Lista usuário com email
  P3->>P2: vazio
  P2->>P1: vazio 404
  P1->>A1: Solicita criação de senha
  A1->>P1: Prompta senha
  P1->>P1: Valida senha
  A1->>P1: Prompta confirmação de senha
  P1->>P1: Valida confirmação de senha
  P1->>P2: POST /register
  P2->>P3: Create user email e senha
  P3->>P2: Dados do usuário novo
  P2->>P3: Solicita envio do email de confirmação
  P2->>P1: Conta criada
  P1->>A1: Solicita que usuário confirme o email

Fluxo de recuperação de senha:

---
config:
  layout: elk
  look: neo
  theme: default
---
flowchart TB

 subgraph s3["Solicitação de reset de senha"]
        n17(["Solicitação de reset de senha"])
        n18["Email"]
        n19["Verifica se existe no cnn id"]
        n20["Envio de email com link de reset de senha"]
        n29["Mensagem de erro + Botão de criar nova conta"]
        n30["Mensagem de sucesso + informativo do email"]
        n31["Revoga links anteriores de reset de senha"]
  end

 subgraph s4["Reset de senha"]
        n21(["Reset de senha"])
        n22["Token de reset de senha"]
        n23["Token de reset é valido"]
        n24["Nova senha
Confirmação da nova senha"] n25["Atualiza dados de acesso"] n26["Mensagem de sucesso"] n27["Redireciona para Login"] n28["Mensagem de link expirado + Botão de solicitar reset de senha"] n32["Revoga links de reset de senha"] end n17 --> n21 n17 --> n18 n18 --> n19 n19 -- NÃO --> n29 n19 -- SIM --> n31 n31 --> n20 n20 --> n30 n21 --> n22 n22 --> n23 n23 -- SIM --> n24 n23 -- NÃO --> n28 n24 --> n25 n25 --> n32 n32 --> n26 n26 --> n27 n18@{ shape: manual-input} n19@{ shape: diam} n20@{ shape: subproc} n29@{ shape: display} n30@{ shape: display} n31@{ shape: subproc} n22@{ shape: lean-l} n23@{ shape: diam} n24@{ shape: manual-input} n25@{ shape: subproc} n26@{ shape: display} n27@{ shape: display} n28@{ shape: display} n32@{ shape: subproc}

A recuperação de senha acontece em dois tempos. Em um primeiro momento, o usuário indica a necessidade de recuperar a senha de uma conta. O sistema deve enviar um e-mail para ele com um link único de recuperação – essa é a forma que temos para saber que ele é de fato proprietário da conta. Acessando esse link, o usuário poderá inserir a nova senha desejada.

Fluxo de recuperação de senha
sequenceDiagram
  actor A1 as User
  participant P1 as CNN ID - Frontend
  participant P2 as CNN ID - Backend
  participant P3 as Firebase - Auth/Admin
  A1->>P1: Clica em "recuperar senha"
  P1->>A1: Prompta email
  A1->>P1: Email
  P1->>P2: POST /solicita-recuperacao-senha
  P2->>P3: Lista usuário com email
  P3->>P2: Dados do usuário
  P2->>P3: Envia link de rest de senha
  P3--xA1: Email de recuperação de senha
  P2->>P1: Email enviado
  P1->>A1: Informa email de reset de senha enviado
  A1->>P1: Entra em reset de senha
  A1->>P1: Prompta senha
  P1->>P1: Valida senha
  A1->>P1: Prompta confirmação de senha
  P1->>P1: Valida confirmação de senha
  P1->>P2: POST /reset-password
  P2->>P3: Valida token de reset de senha
  P2->>P3: Reseta senha
  P2->>P1: Senha resetada
  P1->>A1: Redireciona login

Fluxo de confirmação de email:

---
config:
  layout: elk
  look: neo
  theme: default
---
flowchart TB

 subgraph s5["Solicitar confirmação de email"]
        n33(["Solicitar confirmação de email"])
        n34["Email"]
        n35["Email existe no cnn id"]
        n36["Envio de link de confirmação de email"]
        n37["Mensagem de sucesso + link para reenviar"]
        n38["Mensagem de erro + Botão de criar nova conta"]
  end

 subgraph s6["Confirmação de email"]
        n39(["Confirmação de email"])
        n40["Token de confirmação"]
        n41["Token é valido"]
        n42["Marcar email como verificado"]
        n43["Mensagem de sucesso"]
        n44["Mensagem de link expirado + Botão de solicitar verificação de email"]
  end
    n33 --> n39
    n33 --> n34
    n34 --> n35
    n35 -- SIM --> n36
    n35 -- NÃO --> n38
    n36 --> n37

    n39 --> n40
    n40 --> n41
    n41 -- SIM --> n42
    n41 -- NÃO --> n44
    n42 --> n43

    n34@{ shape: manual-input}
    n35@{ shape: diam}
    n36@{ shape: subproc}
    n37@{ shape: display}
    n38@{ shape: display}
    n40@{ shape: lean-l}
    n41@{ shape: diam}
    n42@{ shape: subproc}
    n43@{ shape: display}
    n44@{ shape: display}

A confirmação de e-mail é um passo crucial para termos confiabilidade de que o cadastro realizado é realmente válido. Por esse motivo, o acesso ao cadastro feito com e-mail e senha só será liberado após a confirmação do e-mail.

Para atender a essa demanda, é necessário que tenhamos um fallback para quando o usuário “esquecer” de confirmar o e-mail após o registro. Esse fallback deve permitir reenviar o e-mail de confirmação enviado antes. Dessa forma, temos duas formas de ativar o fluxo de confirmação de e-mail, uma pelo botão e outra após a criação da conta.

Fluxo de confirmação de e-mail com botão
sequenceDiagram
  actor A1 as User
  participant P1 as CNN ID - Frontend
  participant P2 as CNN ID - Backend
  participant P3 as Firebase - Auth/Admin
  A1->>P1: Clica em "Enviar confirmaçã́o de email"
  A1->>P1: Email
  P1->>P2: POST /ask-email-confirmation
  P2->>P3: Envia email de confirmação de conta
  P3--xA1: Email de confirmação
  P2->>P1: Email enviado
  P1->>A1: Informa email foi enviado com sucesso
  A1->>P1: Clica no link do email
  P1->>P2: POST /email-confirmation
  P2->>P3: Valida token de confirmação
  P2->>P3: Confirma email
  P2->>P1: Email confirmado
  P1->>A1: Redireciona login
Fluxo de confirmação de e-mail com registro
sequenceDiagram
  actor A1 as User
  participant P1 as CNN ID - Frontend
  participant P2 as CNN ID - Backend
  participant P3 as Firebase - Auth/Admin
  A1->>P1: Acabou de criar a conta
  P1->>P2: POST /register
  P2->>P2: Coisas relacionadas ao registro
  P2->>P2: Evendo de usuário registrado
  P2->>P3: Envia email de confirmação de conta
  P3--xA1: Email de confirmação
  P2->>P1: Email enviado
  P1->>A1: Informa email foi enviado com sucesso
  A1->>P1: Clica no link do email
  P1->>P2: POST /email-confirmation
  P2->>P3: Valida token de confirmação
  P2->>P3: Confirma email
  P2->>P1: Email confirmado
  P1->>A1: Redireciona login