Skip to content

🔐 Documentação de Autenticação de Cliente

📋 Visão Geral

A autenticação de cliente permite que o consumidor final acesse recursos protegidos da loja — como pedidos, endereços, lista de desejos e carteira — por meio de um token JWT.

O fluxo começa com a verificação de existência do cadastro, avança para o login (por e-mail ou documento) e, quando a loja exige autenticação multifator (MFA), inclui uma etapa adicional de confirmação antes de emitir o token definitivo.

🔄 Fluxo de Autenticação

1. Verificar existência do cadastro

Antes de apresentar o formulário de login ou cadastro, utilize POST /customer/login/check para verificar se o cliente já possui registro na loja.

A resposta retorna "exists" ou "not-exists", permitindo ao frontend direcionar o usuário para o fluxo correto sem expor dados do cliente.

2. Realizar o login

Com o cadastro confirmado, autentique o cliente por um dos dois métodos disponíveis:

  • POST /customer/login/email — login por e-mail e senha
  • POST /customer/login/document — login por CPF ou CNPJ e senha
  • Em caso de sucesso sem MFA, a resposta retorna diretamente o token JWT definitivo.

    3. Concluir o MFA (quando exigido)

    Quando a loja exige autenticação multifator, o login não retorna o token — retorna um mfaToken temporário.

    Utilize POST /customer/login/mfa/send para enviar o código ao canal escolhido (e-mail, SMS, WhatsApp ou serviço externo) e POST /customer/login/mfa para confirmar o código e receber o token definitivo.

    🪙 Token JWT

    O token retornado após o login deve ser enviado no header de todas as requisições que exigem cliente autenticado:

    1Authorization: Bearer {token}

    O token não possui um prazo de expiração fixo por padrão — sua validade depende da configuração da loja.

    🛡️ Autenticação Multifator (MFA)

    O MFA é ativado por configuração da loja. Quando ativo, o fluxo de login é estendido:

    EtapaEndpointDescrição
    Login inicialPOST /customer/login/email ou /documentRetorna mfaToken em vez do token definitivo
    Enviar códigoPOST /customer/login/mfa/sendDispara o código para o canal escolhido (e-mail, SMS, WhatsApp, externo)
    Confirmar códigoPOST /customer/login/mfaValida o código e retorna o token definitivo
    A opção app (autenticador TOTP) não passa pelo mfa/send — o código é gerado diretamente pelo aplicativo autenticador.

    📌 Notas e Considerações

  • Todos os endpoints de autenticação são públicos — não exigem Authorization header na requisição.
  • O campo document nos endpoints de login aceita CPF e CNPJ com ou sem formatação — caracteres especiais são removidos automaticamente antes da validação.
  • O mfaToken é temporário e expira após um curto período. Caso expire, o cliente deve reiniciar o fluxo de login.
  • O envio de código MFA via mfa/send é suportado apenas para as opções email, sms, whatsapp e external. A opção app (TOTP) não é elegível para esse endpoint.
  • Quando a loja utiliza MFA com opção app e a chave ainda não foi persistida para o cliente, o campo secretKey pode ser enviado no POST /customer/login/mfa para registrá-la durante a confirmação.

🔎 Verificar Cliente Existente

POST /customer/login/check

Verifica se um e-mail ou documento já está cadastrado na loja

📋 Descrição

Endpoint responsável por verificar a existência de um cliente na loja a partir de um e-mail ou documento (CPF/CNPJ).

Útil para evitar duplicidade de registros e direcionar corretamente o fluxo do frontend — orientando o usuário para o formulário de login quando o cadastro existe, ou para o de criação quando não existe.

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
Content-Typeapplication/jsonTipo de conteúdo

📦 Parâmetros do Corpo

CampoTipoObrigatórioDescrição
identificationstring✅ SimE-mail ou documento (CPF/CNPJ) para verificação — máximo 255 caracteres
1{
2 "identification": "cliente@exemplo.com"
3}

💡 Exemplo de Requisição

1curl --request POST \
2 --url '{{MAIN_URL}}/customer/login/check' \
3 --header 'Content-Type: application/json' \
4 --data '{
5 "identification": "cliente@exemplo.com"
6 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

Cliente existe

1{
2 "status": true,
3 "data": "exists"
4}

Cliente não existe

1{
2 "status": true,
3 "data": "not-exists"
4}

⚠️ Possíveis Erros

> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.

Código do ErroHTTPDescrição
INVALID_REQUEST_PAYLOAD400Campo identification obrigatório não informado ou inválido

🔎 Verificar canais de venda que o cliente possui login

POST /customer/login/check-sales-channel

Retorna os canais de venda que o cliente possui acesso.

📋 Descrição

Endpoint responsável por retornar os canais de venda que um cliente pode acessar a partir de um e-mail.

Útil para evitar fazer redirects entre lojas ou trocar o canal de venda direcionando para o canal de venda desejado.

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
Content-Typeapplication/jsonTipo de conteúdo

📦 Parâmetros do Corpo

CampoTipoObrigatórioDescrição
identificationstring✅ SimE-mail para verificação — máximo 255 caracteres
1{
2 "identification": "cliente@exemplo.com"
3}

💡 Exemplo de Requisição

1curl --request POST \
2 --url '{{MAIN_URL}}/customer/login/check-sales-channel' \
3 --header 'Content-Type: application/json' \
4 --data '{
5 "identification": "cliente@exemplo.com"
6 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

Cliente existe

1{
2 "status": true,
3 "data": [
4 {
5 "id": 1,
6 "domain": "teste.uappi.store"
7 }
8 ]
9}

🔐 Login de Cliente por Documento

POST /customer/login/document

Autentica um cliente na loja usando documento (CPF/CNPJ) e senha

📋 Descrição

Endpoint responsável por autenticar um cliente na loja por meio de documento (CPF ou CNPJ) e senha.

Em caso de sucesso, retorna um token JWT que deve ser enviado no header Authorization: Bearer {token} em todas as requisições que exigem o cliente autenticado.

Quando a loja exige autenticação multifator (MFA), o login não retorna o token diretamente — retorna um mfaToken temporário que deve ser utilizado para concluir o segundo fator de verificação.

O campo document aceita CPF e CNPJ em qualquer formato, incluindo o formato alfanumérico — caracteres especiais são removidos automaticamente antes da validação.

Se a loja tiver um app de CAPTCHA instalado, ativo, com chave configurada e com esta rota habilitada, a requisição precisa incluir o header X-Recaptcha-Token, validado junto ao provedor antes da senha ser verificada; se a validação falhar, o login é bloqueado sem que a senha seja checada (fail-closed). Quando a validação passa, a resposta inclui o header Uappi-Recaptcha: success.

Se qualquer uma dessas condições não for atendida (nenhum app instalado, app inativo, sem chave configurada, ou esta rota não configurada no app), o recaptcha é ignorado — o login segue o fluxo normal, sem nenhuma chamada de recaptcha, e o header X-Recaptcha-Token é ignorado se enviado. Não há nenhum erro nesse caso.

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
Content-Typeapplication/jsonTipo de conteúdo

🏷️ Headers Opcionais

HeaderValorDescrição
X-Recaptcha-TokenToken gerado pelo widget do provedor de CAPTCHA no frontendSó é validado se o app de recaptcha estiver instalado, ativo, configurado e com esta rota habilitada — caso contrário é ignorado (bypass)

📦 Parâmetros do Corpo

CampoTipoObrigatórioDescrição
documentstring✅ SimCPF ou CNPJ do cliente, incluindo o formato alfanumérico — caracteres especiais removidos automaticamente — máximo 100 caracteres
passwordstring✅ SimSenha do cliente — mínimo 8, máximo 64 caracteres
Formatos aceitos para CPF: 12345678901, 123.456.789-01, 123 456 789 01

Formatos aceitos para CNPJ: 12345678000190, 12.345.678/0001-90, 12 345 678 0001 90

CNPJ também aceita o formato alfanumérico da Receita Federal (letras nas 12 primeiras posições, dígitos verificadores sempre numéricos), por exemplo: 12ABC34501DE35, 12.ABC.345/01DE-35. O documento é normalizado automaticamente para maiúsculas antes da validação — entrada em minúsculas ou case misto é aceita normalmente.

1{
2 "document": "123.456.789-01",
3 "password": "minhasenha123"
4}

💡 Exemplo de Requisição

1curl --request POST \
2 --url '{{MAIN_URL}}/customer/login/document' \
3 --header 'Content-Type: application/json' \
4 --header 'X-Recaptcha-Token: 03AGdBq27...' \
5 --data '{
6 "document": "123.456.789-01",
7 "password": "minhasenha123"
8 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

Quando o recaptcha foi validado com sucesso, a resposta inclui o header Uappi-Recaptcha: success. Se o recaptcha foi ignorado (nenhum app pronto para esta rota), o header não é enviado.

1{
2 "status": true,
3 "data": {
4 "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
5 }
6}

Resposta quando MFA é obrigatório

Quando o servidor exige autenticação multifator, o token não é retornado — em vez disso, é retornado um mfaToken temporário para prosseguir com a validação.

1{
2 "status": true,
3 "data": {
4 "mfaToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
5 }
6}

⚠️ Possíveis Erros

> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.

Código do ErroHTTPDescrição
UAPPI_STORE_INVALID_LOGIN401Credenciais inválidas — documento ou senha incorretos
UAPPI_STORE_CUSTOMER_AUTH_NOT_FOUND401Cliente sem senha configurada — o cliente existe mas não possui senha (comum em clientes importados); um e-mail de recuperação de senha é disparado automaticamente
UAPPI_AUTH_DISABLED403Recurso desativado — autenticação desabilitada para este canal
UAPPI_AUTH_NOT_FOUND404Recurso não encontrado
UAPPI_APP_RECAPTCHA_TOKEN_MISSING400Token ausente — o app de recaptcha está pronto para esta rota, mas o header X-Recaptcha-Token não foi enviado ou está vazio
UAPPI_APP_RECAPTCHA_TOKEN_INVALID400Token inválido — o provedor rejeitou o token
UAPPI_APP_RECAPTCHA_TOKEN_EXPIRED_OR_DUPLICATED400Token expirado ou já utilizado — o provedor identificou o token como timeout-or-duplicate
UAPPI_APP_RECAPTCHA_SCORE_TOO_LOW400Score abaixo do mínimo — reCAPTCHA v3, score retornado pelo provedor menor que o threshold configurado para esta rota
UAPPI_APP_RECAPTCHA_ACTION_MISMATCH400Action divergente — reCAPTCHA v3, o action retornado pelo provedor não corresponde a esta rota
UAPPI_APP_RECAPTCHA_FAIL400Falha de infraestrutura na validação — erro ou timeout (5s) na comunicação com o provedor, fail-closed
Todos os erros acima só ocorrem quando o app de recaptcha está pronto para esta rota (instalado, ativo, configurado). Se qualquer pré-condição não for atendida, o recaptcha é ignorado silenciosamente — nenhum desses erros é retornado.

🔐 Login de Cliente por Email

POST /customer/login/email

Autentica um cliente na loja usando e-mail e senha

📋 Descrição

Endpoint responsável por autenticar um cliente na loja por meio de e-mail e senha.

Em caso de sucesso, retorna um token JWT que deve ser enviado no header Authorization: Bearer {token} em todas as requisições que exigem o cliente autenticado.

Quando a loja exige autenticação multifator (MFA), o login não retorna o token diretamente — retorna um mfaToken temporário que deve ser utilizado para concluir o segundo fator de verificação.

Se a loja tiver um app de CAPTCHA instalado, ativo, com chave configurada e com esta rota habilitada, a requisição precisa incluir o header X-Recaptcha-Token, validado junto ao provedor antes da senha ser verificada; se a validação falhar, o login é bloqueado sem que a senha seja checada (fail-closed). Quando a validação passa, a resposta inclui o header Uappi-Recaptcha: success.

Se qualquer uma dessas condições não for atendida (nenhum app instalado, app inativo, sem chave configurada, ou esta rota não configurada no app), o recaptcha é ignorado — o login segue o fluxo normal, sem nenhuma chamada de recaptcha, e o header X-Recaptcha-Token é ignorado se enviado. Não há nenhum erro nesse caso.

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
Content-Typeapplication/jsonTipo de conteúdo

🏷️ Headers Opcionais

HeaderValorDescrição
X-Recaptcha-TokenToken gerado pelo widget do provedor de CAPTCHA no frontendSó é validado se o app de recaptcha estiver instalado, ativo, configurado e com esta rota habilitada — caso contrário é ignorado (bypass)

📦 Parâmetros do Corpo

CampoTipoObrigatórioDescrição
emailstring✅ SimE-mail do cliente — máximo 255 caracteres
passwordstring✅ SimSenha do cliente — mínimo 8, máximo 64 caracteres
1{
2 "email": "cliente@exemplo.com",
3 "password": "minhasenha123"
4}

💡 Exemplo de Requisição

1curl --request POST \
2 --url '{{MAIN_URL}}/customer/login/email' \
3 --header 'Content-Type: application/json' \
4 --header 'X-Recaptcha-Token: 03AGdBq27...' \
5 --data '{
6 "email": "cliente@exemplo.com",
7 "password": "minhasenha123"
8 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

Quando o recaptcha foi validado com sucesso, a resposta inclui o header Uappi-Recaptcha: success. Se o recaptcha foi ignorado (nenhum app pronto para esta rota), o header não é enviado.

1{
2 "status": true,
3 "data": {
4 "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
5 }
6}

Resposta quando MFA é obrigatório

Quando o servidor exige autenticação multifator, o token não é retornado — em vez disso, é retornado um mfaToken temporário para prosseguir com a validação.

1{
2 "status": true,
3 "data": {
4 "mfaToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
5 }
6}

⚠️ Possíveis Erros

> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.

Código do ErroHTTPDescrição
UAPPI_STORE_INVALID_LOGIN401Credenciais inválidas — e-mail ou senha incorretos
UAPPI_STORE_CUSTOMER_AUTH_NOT_FOUND401Cliente sem senha configurada — o cliente existe mas não possui senha (comum em clientes importados); um e-mail de recuperação de senha é disparado automaticamente
UAPPI_AUTH_DISABLED403Recurso desativado — autenticação desabilitada para este canal
UAPPI_AUTH_NOT_FOUND404Recurso não encontrado
UAPPI_APP_RECAPTCHA_TOKEN_MISSING400Token ausente — o app de recaptcha está pronto para esta rota, mas o header X-Recaptcha-Token não foi enviado ou está vazio
UAPPI_APP_RECAPTCHA_TOKEN_INVALID400Token inválido — o provedor rejeitou o token
UAPPI_APP_RECAPTCHA_TOKEN_EXPIRED_OR_DUPLICATED400Token expirado ou já utilizado — o provedor identificou o token como timeout-or-duplicate
UAPPI_APP_RECAPTCHA_SCORE_TOO_LOW400Score abaixo do mínimo — reCAPTCHA v3, score retornado pelo provedor menor que o threshold configurado para esta rota
UAPPI_APP_RECAPTCHA_ACTION_MISMATCH400Action divergente — reCAPTCHA v3, o action retornado pelo provedor não corresponde a esta rota
UAPPI_APP_RECAPTCHA_FAIL400Falha de infraestrutura na validação — erro ou timeout (5s) na comunicação com o provedor, fail-closed
Todos os erros acima só ocorrem quando o app de recaptcha está pronto para esta rota (instalado, ativo, configurado). Se qualquer pré-condição não for atendida, o recaptcha é ignorado silenciosamente — nenhum desses erros é retornado.

🔐 Confirmação de Login MFA de Cliente

POST /customer/login/mfa

Conclui o login MFA de cliente

📋 Descrição

Endpoint responsável por concluir o login quando a loja exige autenticação multifator — recebe o mfaToken retornado no login inicial, a opção MFA selecionada e o código de verificação, e retorna o token JWT definitivo.

Para a opção app (TOTP), o campo secretKey pode ser enviado quando a chave MFA ainda não foi persistida para o cliente — o sistema registra a chave durante a confirmação.

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
Content-Typeapplication/jsonTipo de conteúdo

📦 Parâmetros do Corpo

CampoTipoObrigatórioDescrição
mfaTokenstring✅ SimToken MFA temporário retornado no login inicial
mfaOptionIdinteger✅ SimID da opção MFA selecionada pelo cliente
codestring✅ SimCódigo MFA de 6 dígitos
secretKeystring❌ NãoChave TOTP — usado apenas na opção app quando a chave ainda não foi registrada

💡 Exemplo de Requisição

1curl --request POST \
2 --url '{{MAIN_URL}}/customer/login/mfa' \
3 --header 'Content-Type: application/json' \
4 --data '{
5 "mfaToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJI...",
6 "mfaOptionId": 1,
7 "code": "123456",
8 "secretKey": "JBSWY3DPEHPK3PXP"
9 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

1{
2 "status": true,
3 "data": {
4 "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJI..."
5 }
6}

⚠️ Possíveis Erros

> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.

Código do ErroHTTPDescrição
INVALID_REQUEST_PAYLOAD400Payload inválido — campos obrigatórios ausentes ou com formato incorreto
UAPPI_STORE_CUSTOMER_MFA_CODE_INVALID400Código MFA inválido
UAPPI_STORE_CUSTOMER_MFA_CODE_EXPIRED400Código MFA expirado
UAPPI_STORE_CUSTOMER_MFA_CODE_ATTEMPTS_EXCEEDED400Limite de tentativas de validação do código excedido
UAPPI_STORE_CUSTOMER_MFA_NO_VALID_OPTION400Opção MFA inválida para o contexto atual
INVALID_MFA_TOKEN401Token MFA inválido
EXPIRED_MFA_TOKEN403Token MFA expirado — reinicie o fluxo de login
UAPPI_STORE_CUSTOMER_NOT_FOUND404Cliente não encontrado

📨 Envio de Desafio MFA no Login de Cliente

POST /customer/login/mfa/send

Envia desafio MFA para login de cliente

📋 Descrição

Endpoint responsável por enviar um novo código MFA para uma opção notificável elegível no fluxo de login.

Tipos aceitos para envio: email, sms, whatsapp e external. A opção app (TOTP) não é elegível — o código é gerado diretamente pelo aplicativo autenticador, sem necessidade de envio.

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
Content-Typeapplication/jsonTipo de conteúdo

📦 Parâmetros do Corpo

CampoTipoObrigatórioDescrição
mfaTokenstring✅ SimToken MFA temporário retornado no login inicial
mfaOptionIdinteger✅ SimID da opção MFA notificável — email, sms, whatsapp ou external

💡 Exemplo de Requisição

1curl --request POST \
2 --url '{{MAIN_URL}}/customer/login/mfa/send' \
3 --header 'Content-Type: application/json' \
4 --data '{
5 "mfaToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJI...",
6 "mfaOptionId": 2
7 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

1{
2 "status": true,
3 "data": true
4}

⚠️ Possíveis Erros

> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.

Código do ErroHTTPDescrição
INVALID_REQUEST_PAYLOAD400Payload inválido — campos obrigatórios ausentes ou com formato incorreto
UAPPI_STORE_CUSTOMER_MFA_NO_VALID_OPTION400Opção MFA inválida ou não elegível para envio
INVALID_MFA_TOKEN401Token MFA inválido
EXPIRED_MFA_TOKEN403Token MFA expirado — reinicie o fluxo de login
UAPPI_STORE_CUSTOMER_NOT_FOUND404Cliente não encontrado
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_CONNECTION_ERROR502Falha de conexão ao serviço externo da opção MFA
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_CLIENT_ERROR502Serviço externo retornou erro de cliente
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_SERVER_ERROR502Serviço externo retornou erro de servidor
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_UNKNOWN_ERROR502Falha desconhecida ao acionar serviço externo
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_TIMEOUT_ERROR502Timeout ao acionar serviço externo

Uappi é a melhor opção para o crescimento da sua loja!

;