> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Métodos de login: passkeys, códigos, social e SSO

> Configure no Didit login por senha, código por e-mail ou telefone, link mágico, passkey, social, SSO, Didit ID Wallet, MFA e redefinição de senha.

> [!WARNING]
>
> A autenticação é um recurso novo. A página de login hospedada executa todos os métodos desta página. Os endpoints JSON listados aqui são para equipes que criam as próprias telas de login (`sign_in_ui: "own"`).

Ative um método com `PUT methods/{name}/` e `{"enabled": true}` na API de gerenciamento de autenticação da sua aplicação, ou pelo console. O login hospedado mostra apenas os métodos que você ativou.

| Método | Nome | Configuração |
| - | - | - |
| Senha | `password` | Também é necessário para o cadastro por e-mail com senha. |
| Código por e-mail | `code` | Nenhuma. |
| Link mágico | `magic` | Nenhuma. Somente páginas hospedadas. |
| Código por telefone | `phone` | Envie o `workflow_id` de um fluxo de verificação por telefone. |
| Passkey | `passkey` | Nenhuma. |
| Login social | `google`, `microsoft`, `apple`, `github` | Seus próprios `client_id` e `client_secret`. Aplicações de sandbox podem usar os apps de teste da Didit (`credential_source: "didit_test"`). |
| SSO da organização | `sso` | Uma conexão SAML ou OIDC por organização do cliente. |
| Didit ID Wallet | `wallet` | Sempre ativado. Não pode ser desativado. |

Cada chamada JSON abaixo começa com uma `transaction` obtida em `POST authorize/`. Essa transação dura 10 minutos. Um login bem-sucedido retorna `{code, redirect_uri, state}`. Troque o código em `POST token/` em até 60 segundos (consulte [tokens e JWKS](https://docs.didit.me/pt-br/authentication/tokens-and-jwks.md)).

Em vez de um código, uma chamada de login pode retornar uma destas etapas. Conclua a etapa e você receberá o código.

| Resposta | Próxima etapa |
| - | - |
| `mfa_required` com `challenge` e `factors` | Envie um código TOTP ou de recuperação, ou use uma passkey (consulte [MFA](#mfa)). |
| `mfa_enrollment_required` com `challenge` e `uri` | A política de MFA exige um autenticador. Cadastre-o com `POST mfa/setup/`. |
| `protection_required` com `challenge` e `methods` | Uma política de [proteção contra bots](https://docs.didit.me/pt-br/authentication/bot-protection.md) solicita uma prova adicional. |
| `verification_required` com `verification_url` | Suas configurações de verificação exigem uma prova de vida ou verificação de identidade no cadastro ou no login. Direcione a pessoa para `verification_url` (válida por 30 minutos); o código é emitido após uma verificação aprovada. |

## Senha

`POST password/` recebe `transaction`, `email` e `password`.

* A senha deve atender ao seu `password_min_length` (8, 10, 12 ou 14 caracteres; 10 por padrão). Senhas comuns e totalmente numéricas são rejeitadas com `password_policy`. Quando a [verificação de senhas vazadas](https://docs.didit.me/pt-br/authentication/bot-protection.md#senhas-vazadas) está ativada, uma senha sabidamente vazada é rejeitada com `password_breached`.
* Somente pessoas com e-mail verificado podem fazer login com senha.
* Senha incorreta, e-mail desconhecido, e-mail não verificado, conta travada e conta bloqueada recebem todos a mesma resposta: `400 {"error": "invalid_credentials"}`. Sua UI não consegue saber qual foi o caso, e um invasor também não.

### Cadastro

O cadastro verifica o e-mail primeiro. Chame `POST email/start/` com `purpose: "signup"`, `email` e `password` e, em seguida, `POST email/complete/` com o código. A conta é criada com o e-mail já verificado.

* `signup_policy` define quem pode se cadastrar: `anyone`, `invited` (somente com um link de convite) ou `allowed_domains`.
* Com `allow_subaddresses: false` (o padrão), um endereço com `+` na parte local é rejeitado.
* Quando a identidade visual da sua marca inclui links para os termos ou a política de privacidade, o formulário de cadastro hospedado pede que a pessoa os aceite.

## Código por e-mail

`POST email/start/` recebe `transaction`, `purpose` (`login` ou `signup`) e `email`, e retorna `202 {challenge, expires_in: 600}`. A pessoa recebe um código de 6 dígitos que dura 10 minutos.

`POST email/complete/` recebe `transaction`, `purpose`, `challenge` e `code`. Você tem 5 tentativas; depois disso, a pessoa precisa solicitar um novo código. A página hospedada oferece um novo código após 30 segundos.

Um código de login para um endereço sem conta cria uma conta quando o seu `signup_policy` permite. Isso é cadastro sem senha.

## Link mágico

A página hospedada envia um link de login que dura 15 minutos. Ele permanece vinculado à transação PKCE original, então o link funciona apenas no fluxo que o iniciou. A pessoa confirma o login na página que o link abre. Não há endpoint JSON para links mágicos.

## Código por telefone

`POST phone/start/` recebe `transaction`, `phone` e um `channel` opcional (`sms`, o padrão, ou `whatsapp`). O número é normalizado para E.164. Retorna `202 {challenge, expires_in: 600}`.

`POST phone/complete/` recebe `transaction`, `challenge` e o `code` de 6 dígitos. Você tem 5 tentativas.

* Os códigos por telefone são entregues pelo serviço de verificação por telefone da Didit. Ative o método com o `workflow_id` de um fluxo que contenha a verificação por telefone.
* O primeiro login por telefone só cria uma conta quando `signup_policy` é `anyone`.
* Se a entrega falhar, a chamada retorna `503 {"error": "delivery_unavailable"}`.

## Passkeys

As passkeys usam WebAuthn. A parte confiável é a origem de login da sua aplicação. A Didit solicita uma credencial detectável (resident key) e sempre exige a verificação do usuário, como impressão digital, rosto ou PIN do dispositivo. A Didit não solicita attestation.

| Chamada | Corpo | Resultado |
| - | - | - |
| `POST passkeys/begin/` | `{transaction}` | `{challenge, options}` para `navigator.credentials.get()`. Nenhuma lista de credenciais é enviada, então o navegador oferece todas as passkeys da sua origem. |
| `POST passkeys/complete/` | `{challenge, credential}` | Um código de login ou uma próxima etapa. |
| `POST passkeys/register/` | Vazio, com `Authorization: Bearer <access_token>` | Opções para `navigator.credentials.create()`. |
| `POST passkeys/confirm/` | `{challenge, credential}`, com o mesmo token | `{id}` da nova passkey. |

* O desafio de uma passkey dura 5 minutos.
* Adicionar uma passkey exige uma sessão criada nos últimos 5 minutos. Caso contrário, a chamada retorna `403 {"error": "reauthentication_required"}`. Peça à pessoa para fazer login novamente primeiro.
* Um login com passkey conta como autenticação multifator.
* Após o cadastro, a página hospedada oferece a opção de adicionar uma passkey (`passkeys/setup/begin/` e `passkeys/setup/complete/`).
* Apps Android registrados na aplicação podem usar as mesmas passkeys.

## Login social

O login com Google, Microsoft, Apple e GitHub usa as credenciais do seu próprio app OAuth, definidas com `PUT methods/{provider}/` e `credentials: {client_id, client_secret}`. O callback do provedor fica na sua origem de login.

Na primeira vez que alguém faz login com um provedor, a pessoa também comprova que é titular do endereço de e-mail com um código (`POST social/email/start/` e `POST social/email/verify/`). Os logins seguintes com esse provedor pulam essa etapa.

O GitHub não consegue comprovar um login recente, por isso não é oferecido quando você envia `prompt=login` ou `max_age`.

## SSO da organização

O SSO da organização permite que a empresa de um cliente faça login pelo próprio provedor de identidade SAML ou OIDC. Configure-o por organização cliente em `organizations/{id}/sso/` com `protocol` (`saml` ou `oidc`), `enabled` e `config`.

* Você pode enviar à equipe de TI do cliente um link de configuração válido por 7 dias.
* Os metadados do seu provedor de serviços SAML são publicados em `{origin}/sso/saml/metadata/`.
* O login hospedado encontra a conexão pelo domínio do e-mail verificado da pessoa ou por `organization=<slug>` na URL de login.

## Didit ID Wallet

Pessoas que já fizeram uma verificação pela Didit podem fazer login com a Didit ID Wallet. Esse método está sempre ativado. O `verified_identity` da sessão passa então a conter o que a pessoa escolheu compartilhar.

## MFA

O segundo fator é um app autenticador (TOTP) com códigos de recuperação, ou uma passkey.

* `mfa_policy` define quem deve usar MFA: `optional`, `everyone` ou `organization_admins` (o padrão). Quem cadastrou um autenticador deve sempre usá-lo.
* Para cadastrar um autenticador, chame `POST mfa/enroll/` com uma sessão recente (criada há no máximo 5 minutos). A chamada retorna `{challenge, uri}`; exiba o `uri` como QR code. Em seguida, envie o primeiro código para `POST mfa/confirm/`. A resposta contém 10 códigos de recuperação de uso único. Exiba-os uma única vez.
* No login, envie um código TOTP ou de recuperação para `POST mfa/complete/` com o `challenge`. Você tem 5 tentativas. Para usar uma passkey, chame `POST mfa/passkey/begin/` e `POST mfa/passkey/complete/`.
* Os códigos usam intervalos de 30 segundos. Um código que já foi aceito não pode ser usado novamente.
* Códigos por SMS e e-mail não estão disponíveis como segundo fator.

## Esquecimento e redefinição de senha

`POST password-reset/start/` recebe `email` e retorna `202 {"status": "sent", "expires_in": 1800}`. A resposta é a mesma, independentemente de o endereço ter uma conta ou não. O link de redefinição vale por 30 minutos.

`POST password-reset/complete/` recebe `token` e `password` e retorna `{"status": "password_changed"}`. Além disso, a chamada:

* remove o bloqueio de acesso,
* encerra todas as sessões quando `revoke_on_password_change` está ativado (o padrão),
* invalida outros códigos e links pendentes dessa pessoa.

## Convites

Com `signup_policy: "invited"`, só pessoas convidadas podem se cadastrar. Um link de convite vale por 7 dias e abre a página hospedada `/invite`.

Continue com [tokens e JWKS](https://docs.didit.me/pt-br/authentication/tokens-and-jwks.md) ou leia sobre [proteção contra bots](https://docs.didit.me/pt-br/authentication/bot-protection.md) para bloqueios e desafios.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.