Pular para o conteúdo
Decoding Chat API

Autenticação multifator

A autenticação multifator solicita uma segunda prova de identidade após a senha da conta. O Decoding Chat aceita um aplicativo autenticador TOTP e credenciais WebAuthn, como uma passkey. Um código de backup de uso único funciona no lugar de um código TOTP, e o modo sudo reutiliza esses fatores para proteger todas as operações sensíveis à segurança na API.

Todas as rotas aqui requerem uma sessão de usuário que não seja de bot. O Decoding Chat rejeita uma conta em estado de atividade suspeita com 403 ACCOUNT_SUSPICIOUS_ACTIVITY, inclusive nas rotas sudo.

O Decoding Chat valida um código TOTP como uma senha de uso único HMAC-SHA-1 de seis dígitos ao longo de um intervalo de tempo de 30 segundos contado a partir do Unix epoch. Ele aceita um intervalo de tempo de diferença de relógio (clock skew) para mais ou para menos. Um código enviado possui exatamente seis dígitos decimais, e o Decoding Chat rejeita qualquer outro valor. O segredo compartilhado é Base32, e o Decoding Chat ignora espaços em branco, hifens e preenchimento (padding) à direita ao decodificá-lo.

O cliente gera o segredo, apresenta-o ao usuário e o envia com um código derivado dele ao chamar Ativar MFA TOTP. O Decoding Chat nunca gera ou retorna um segredo TOTP.

Regenerar códigos de backup exclui o conjunto armazenado e então emite exatamente 10 substitutos, de modo que qualquer código que o usuário já tenha salvo para de funcionar.

Ativar o TOTP emite 10 códigos sem excluir nada primeiro. Uma conta que já gerou um conjunto por meio de Listar códigos de backup MFA enquanto não possuía nenhum segredo TOTP mantém esses códigos ao lado dos 10 que a resposta de ativação retorna. Todos permanecem resgatáveis. Desativar o TOTP exclui todos os códigos de backup sem emitir substitutos.

Listar códigos de backup MFA lê o conjunto atual de volta a qualquer momento e relata quais códigos já foram consumidos. O consumo de um código é irreversível. Uma conta que não pode provar o modo sudo lê o mesmo conjunto por meio do desafio de códigos de backup.

Um código de backup tem apenas estes pontos de entrada: o campo mfa_code do objeto de verificação sudo com mfa_method definido como totp, o campo code de Desativar MFA TOTP e o campo code de concluir login com TOTP. Todos os outros campos de código o rejeitam. Todos aceitam um código de autenticador atual ou um código de backup não consumido. Ativar MFA TOTP valida apenas contra o segredo que está sendo inscrito.

Cada ponto de entrada requer que a conta possua um segredo TOTP. Uma conta cujo único autenticador é o WebAuthn não possui um segredo TOTP, de modo que nenhum dos pontos de entrada aceita um código de backup, embora a conta ainda possa regenerar o conjunto.

Uma conta que perdeu seus códigos de backup salvos lê o conjunto de volta por meio de um desafio enviado por email. Iniciar desafio de códigos de backup MFA abre um ticket e envia um código por email. Verificar código de desafio de códigos de backup MFA troca esse código pelo conjunto atual e uma prova. Regenerar códigos de backup MFA então apresenta o ticket e a prova para substituir o conjunto. Reenviar código de desafio de códigos de backup MFA envia um novo código a qualquer momento antes da verificação.

O modo sudo não se aplica a nenhuma das quatro operações, de modo que um usuário que não possui mais o aplicativo autenticador ainda alcança os códigos por meio do endereço de email. A conta precisa de um endereço de email verificado e do TOTP ativado. Apenas Iniciar desafio de códigos de backup MFA verifica o endereço, e Regenerar códigos de backup MFA verifica o TOTP uma segunda vez.

Um ticket é um UUID versão 4 válido por 30 minutos após o início do desafio, o reenvio do código ou a verificação do código. A regeneração não o estende. Um ticket expirado, desconhecido ou de outra conta falha com INVALID_OR_EXPIRED_TICKET.

Um código de verificação possui oito caracteres extraídos do alfabeto latino maiúsculo e de dígitos decimais, escritos como dois grupos de quatro caracteres separados por um hífen. Um código é válido por 10 minutos a partir do momento em que é enviado, e cada envio substitui o código que o envio anterior emitiu.

A verificação consome o código e emite uma prova como um UUID versão 4. Uma prova incorreta falha com INVALID_PROOF_TOKEN. Um ticket sem prova falha com INVALID_OR_EXPIRED_TICKET em verification_proof.

Cada falha de ticket, código e prova nomeada aqui chega como HTTP 400, cujo código de nível superior é INVALID_FORM_BODY. O valor nomeado é o code de uma entrada do objeto de erro de validação, e o path dessa entrada é o campo ao qual ele pertence.

Cada operação passa por seu próprio bucket de rota e, separadamente, por um dos controles abaixo. Esgotar qualquer um deles produz HTTP 429 mesmo quando o outro tem espaço.

ControlePermissãoOperação
Início do desafio3 envios por 15 minutos para cada contaIniciar desafio de códigos de backup MFA
Reenvio do desafio3 envios por 15 minutos para cada contaReenviar código de desafio de códigos de backup MFA
Verificação de código5 tentativas por 15 minutos para cada ticketVerificar código de desafio de códigos de backup MFA
Regeneração5 tentativas por 15 minutos para cada ticketRegenerar códigos de backup MFA

O Decoding Chat recusa um reenvio por 30 segundos após o envio anterior no mesmo ticket. Essa recusa é HTTP 429 com um Retry-After calculado a partir do momento em que o próximo envio ficar disponível. É independente do bucket de rota e dos controles de envio de 15 minutos.

O modo sudo é uma prova de curta duração de que a pessoa em frente à sessão ainda é a titular da conta. Uma operação que exige isso aceita um cabeçalho de requisição X-Fluxer-Sudo-Mode-JWT válido ou os campos do objeto de verificação sudo dentro do corpo JSON.

Um token sudo dura cinco minutos e funciona apenas para a conta que o obteve, através das sessões dessa conta. Trate-o como opaco. Um novo token é emitido apenas após uma prova MFA de uma conta com um autenticador inscrito.

A prova aceita depende dos autenticadores que a conta tem configurados.

Estado da contaProva aceita
Nenhum autenticadorpassword
Qualquer autenticadormfa_method com seus campos correspondentes, pois password não é mais aceita
Nem um autenticador nem uma credencial de senhaNada, e operações elegíveis para sudo passam

O método totp lê mfa_code como um código de autenticador atual ou um código de backup não consumido e exige que a conta possua um segredo TOTP. O método webauthn lê webauthn_response e webauthn_challenge juntos e exige uma credencial registrada.

Uma requisição que não possui uma prova aceita falha com 403 SUDO_MODE_REQUIRED. Seu corpo possui os membros do objeto de métodos do modo sudo, para que um cliente possa dizer qual prova solicitar ao usuário. Uma prova que está presente, mas incorreta, falha em vez disso com 400 INVALID_FORM_BODY e uma entrada de erro de validação. Uma senha incompatível produz o caminho password com o código INVALID_PASSWORD. Um código TOTP, código de backup ou asserção WebAuthn rejeitado produz o caminho mfa_code com o código INVALID_MFA_CODE, para que um cliente não possa dizer qual dos três foi rejeitado.

O método totp também consome uma permissão por conta de 10 tentativas de multifator a cada 15 minutos, compartilhada por toda operação restrita por sudo em todos os recursos. O Decoding Chat cobra a permissão antes de verificar o código, de forma que um código errado e um código correto consumam essa permissão. Um código correto zera o contador. Enquanto estiver esgotado, um código correto retorna a mesma entrada INVALID_MFA_CODE que um incorreto. O método webauthn não consome permissão alguma. As permissões de MFA de login na autenticação HTTP são contadas separadamente.

O Decoding Chat retorna um token emitido ou ecoado no cabeçalho de resposta X-Fluxer-Sudo-Mode-JWT. Um cliente o mantém e o envia no mesmo cabeçalho em todas as operações posteriores restritas por sudo.

Em uma resposta de erro SUDO_MODE_REQUIRED, has_mfa e methods estão no nível superior do objeto de resposta de erro.

CampoTipoDescrição
has_mfabooleanSe a conta tem o tipo de autenticador TOTP ou WebAuthn
methodsobjeto de disponibilidade de método do modo sudoAutenticadores que a conta pode apresentar
CampoTipoDescrição
totp1booleanSe a conta tem um segredo TOTP e o tipo de autenticador TOTP
webauthnbooleanSe a conta tem o tipo de autenticador WebAuthn

1 Ambas as condições são necessárias, então uma conta que possui um segredo armazenado sem o tipo de autenticador relata false

Operações que exigem modo sudo mesclam esses campos em seu próprio corpo JSON. Todos os campos são opcionais na borda, porque a combinação aceita depende do estado da conta descrito no modo sudo.

CampoTipoDescrição
password?1stringSenha da conta (8-256 caracteres)
mfa_method?2stringMétodo MFA, totp ou webauthn
mfa_code?3stringCódigo do autenticador ou código de backup não consumido (1-32 caracteres)
webauthn_response?4objeto de asserção WebAuthnAsserção produzida para o desafio fornecido
webauthn_challenge?4stringDesafio retornado por criar opções de autenticação sudo WebAuthn (1-256 caracteres)

1 Considerado apenas enquanto a conta não tiver autenticador MFA, e ignorado assim que o TOTP ou uma credencial WebAuthn existir 2 Necessário quando a conta tiver algum autenticador MFA, a menos que um token sudo válido já esteja presente 3 Necessário quando mfa_method for totp, com um código de autenticador atual ou um código de backup não consumido 4 Ambos os campos são necessários juntos quando mfa_method for webauthn

CampoTipoDescrição
backup_codesarray[objeto de código de backup MFA]Os códigos de backup atuais da conta
{
"backup_codes": [
{"code": "a3f2-9kd7", "consumed": false},
{"code": "b81c-4nq0", "consumed": true}
]
}

Um código de backup é formado por dois grupos de quatro caracteres separados por um hífen. Cada grupo é extraído do alfabeto latino minúsculo e dos dígitos decimais.

CampoTipoDescrição
codestringCódigo de backup de uso único
consumedbooleanSe o código já foi consumido

O estado de um ticket de desafio de códigos de backup recém-criado.

CampoTipoDescrição
ticketstringO identificador que todas as etapas posteriores deste fluxo enviam
code_expires_attimestamp ISO8601O momento em que o código enviado por email expira, 10 minutos após ter sido enviado
resend_available_attimestamp ISO8601O primeiro momento em que o código pode ser reenviado, 30 segundos após o último envio

Os códigos de backup e a prova que um desafio verificado retorna.

CampoTipoDescrição
backup_codesarray[objeto de código de backup MFA]Os códigos de backup atuais da conta
verification_proof1stringA prova que Regenerar códigos de backup MFA consome

1 Um reenvio limpa a prova armazenada e a próxima verificação emite um valor diferente

Uma conta possui no máximo 10 credenciais WebAuthn. Tanto Criar opções de registro WebAuthn quanto Registrar credencial WebAuthn aplicam esse limite.

O Decoding Chat verifica cada asserção contra o identificador da parte confiável e as origens permitidas configuradas para a instância. O Decoding Chat rejeita uma asserção cujo contador de assinatura relatado não seja maior que o contador armazenado. A exceção é um contador armazenado e um relatado iguais a zero, que é como um autenticador sem contador aparece.

CampoTipoDescrição
idstringID da credencial em Base64url
namestringNome da credencial atribuído pelo usuário (1-100 caracteres)
created_attimestamp ISO8601O tempo que Registrar credencial WebAuthn armazenou a credencial
last_used_at1?timestamp ISO8601Autenticação bem-sucedida mais recente

1 Nulo até que a credencial conclua um login, MFA ou asserção sudo pela primeira vez

O Decoding Chat nunca retorna a chave pública da credencial, o contador de assinaturas ou os transportes relatados.

CampoTipoDescrição
idstringID da credencial em Base64url
typestringTipo de credencial, sempre public-key
transports?1array[string]Transportes de autenticador a partir dos valores de transporte do autenticador WebAuthn

1 Presente apenas quando o autenticador relatou seus transportes durante o registro

ValorDescrição
bleBluetooth Low Energy
cableCloud-assisted Bluetooth Low Energy
hybridTransporte híbrido
internalAutenticador de plataforma
nfcNear-field communication
smart-cardCartão inteligente
usbAutenticador USB

A serialização PublicKeyCredential do WebAuthn no navegador. Os nomes dos campos estão em camelCase, porque o Decoding Chat aceita a estrutura exata que a API cliente do WebAuthn produz.

CampoTipoDescrição
idstringID da credencial em Base64url
rawIdstringID bruto da credencial em Base64url
responseobjeto de resposta de asserção WebAuthnResposta de asserção do autenticador
authenticatorAttachment?stringAnexo do autenticador, cross-platform ou platform
clientExtensionResultsobjeto de resultados de extensão de cliente WebAuthnSaídas da extensão do cliente
typestringTipo de credencial, sempre public-key

Campos malformados retornam INVALID_FORM_BODY. Cada operação documenta seus erros de verificação criptográfica.

CampoTipoDescrição
clientDataJSONstringJSON de dados do cliente em Base64url
authenticatorDatastringDados do autenticador em Base64url
signaturestringAssinatura da asserção em Base64url
userHandle?1stringIdentificador de usuário em Base64url

1 Presente apenas quando a asserção veio de uma credencial descobrível

CampoTipoDescrição
idstringID da credencial em Base64url
rawIdstringID bruto da credencial em Base64url
responseobjeto de resposta de atestado WebAuthnResposta de atestado do autenticador
authenticatorAttachment?stringAnexo do autenticador, cross-platform ou platform
clientExtensionResultsobjeto de resultados de extensão de cliente WebAuthnSaídas da extensão do cliente
typestringTipo de credencial, sempre public-key

Campos malformados retornam INVALID_FORM_BODY. Um atestado que falha na verificação retorna INVALID_WEBAUTHN_CREDENTIAL.

CampoTipoDescrição
clientDataJSONstringJSON de dados do cliente em Base64url
attestationObjectstringObjeto de atestado em Base64url
authenticatorData?stringDados do autenticador em Base64url
transports?1array[string]Transportes de autenticador a partir dos valores de transporte do autenticador WebAuthn
publicKeyAlgorithm?integerIdentificador do algoritmo de chave pública COSE
publicKey?stringChave pública da credencial em Base64url

1 Retido com a credencial e retornado posteriormente em allowCredentials e excludeCredentials

Objeto de resultados de extensão de cliente WebAuthn

Seção intitulada “Objeto de resultados de extensão de cliente WebAuthn”
CampoTipoDescrição
appid?booleanSe a extensão AppID foi usada
credProps?objeto de propriedades de credencial WebAuthnSaída de propriedades de credencial
hmacCreateSecret?booleanSe o autenticador criou um segredo HMAC

O Decoding Chat aceita campos adicionais de resultados de extensão.

CampoTipoDescrição
rk?booleanSe a credencial criada é descobrível

O Decoding Chat aceita campos adicionais de propriedade de credencial.

Cada operação que emite um desafio de autenticação WebAuthn retorna este objeto: a verificação sudo aqui e as operações de opção de login na autenticação HTTP.

CampoTipoDescrição
challenge1stringDesafio de uso único em Base64url
timeout2integerTempo limite de operação do autenticador em milissegundos
rpIdstringIdentificador da parte confiável configurado para a instância
allowCredentials?3array[objeto de descritor de credencial WebAuthn]Credenciais aceitas para esta operação
userVerification4stringRequisito de verificação de usuário, sendo um entre discouraged, preferred ou required

1 Expira cinco minutos após a emissão e está vinculado à operação que o emitiu, de modo que um desafio sudo não pode ser resgatado como uma asserção de login 2 Cada operação emite o valor fixo 60000, uma opção de requisição padrão para PublicKeyCredential 3 As opções sudo listam cada credencial registrada na conta. O campo está ausente apenas na rota de login descobrível 4 Opções sudo e a conclusão de login MFA solicitam discouraged. O login descobrível solicita e verifica required

O Decoding Chat não emite nenhum outro membro de opções de requisição PublicKeyCredential, então hints e extensions nunca aparecem neste objeto.

CampoTipoDescrição
rpobjeto de parte confiável WebAuthnIdentidade da parte confiável
userobjeto de usuário de registro WebAuthnIdentidade da conta vinculada à credencial
challengestringDesafio de uso único em Base64url
pubKeyCredParams1array[objeto de parâmetro de chave pública WebAuthn]Algoritmos de chave pública aceitos
timeout2integerTempo limite de operação do autenticador em milissegundos
excludeCredentials3array[objeto de descritor de credencial WebAuthn]Credenciais existentes que não podem ser registradas novamente
authenticatorSelection4objeto de seleção de autenticador WebAuthnRequisitos de seleção de autenticador
attestation5stringTransmissão de atestado, sempre none
extensions6objeto de entradas de extensão de cliente WebAuthnExtensões de cliente solicitadas
hints7array[string]Dicas de autenticador

1 Sempre os identificadores COSE -8, -7 e -257, nessa ordem, significando EdDSA, ECDSA com SHA-256 e RSASSA-PKCS1-v1_5 com SHA-256 2 Cada registro emite o valor fixo 60000 3 Contém todas as credenciais já registradas na conta, para que um autenticador não possa inscrever a mesma credencial duas vezes. É um array vazio quando a conta não possui nenhuma 4 O Decoding Chat solicita uma credencial descobrível preferencial e uma verificação de usuário preferencial, e não exige nenhuma das duas, então requireResidentKey é false 5 O Decoding Chat solicita none, então nenhuma declaração de atestado é retida 6 Sempre presente com credProps definido como true, a única extensão que o Decoding Chat solicita 7 Sempre um array vazio

CampoTipoDescrição
namestringNome de exibição da parte confiável configurado para a instância
idstringIdentificador da parte confiável configurado para a instância
CampoTipoDescrição
idstringIdentificador do usuário WebAuthn, o snowflake da conta decimal codificado como base64url
namestringNome de usuário da conta
displayName1stringRótulo de exibição da conta

1 O Decoding Chat fornece o nome de usuário da conta tanto em name quanto em displayName

CampoTipoDescrição
algintegerIdentificador do algoritmo COSE
typestringTipo de credencial, sempre public-key
CampoTipoDescrição
authenticatorAttachment?stringAnexo do autenticador, cross-platform ou platform
requireResidentKey?booleanSe uma credencial descobrível é necessária
residentKey?stringPreferência de credencial descobrível, sendo um entre discouraged, preferred ou required
userVerification?stringPreferência de verificação de usuário, sendo um entre discouraged, preferred ou required

Objeto de entradas de extensão de cliente WebAuthn

Seção intitulada “Objeto de entradas de extensão de cliente WebAuthn”
CampoTipoDescrição
appid?stringValor da extensão AppID
credProps?1booleanSe as propriedades da credencial são solicitadas
hmacCreateSecret?booleanSe a criação de segredo HMAC é solicitada
minPinLength?booleanSe o comprimento mínimo do PIN é solicitado

1 O único membro que o Decoding Chat sempre define, sempre true nas opções de registro WebAuthn

CampoTipoDescrição
totpbooleanSe a conta tem um segredo TOTP e o tipo de autenticador TOTP, conforme o objeto de disponibilidade de método do modo sudo
webauthnbooleanSe a conta tem o tipo de autenticador WebAuthn
has_mfabooleanSe a conta tem o tipo de autenticador TOTP ou WebAuthn, conforme o objeto de métodos do modo sudo
POST/v1/users/@me/mfa/totp/enableMFA

Ativa o TOTP para a conta atual e retorna um objeto de códigos de backup MFA contendo 10 novos códigos. O modo sudo é obrigatório. Emite um evento de Gateway Atualização de Usuário.

O Decoding Chat verifica o modo sudo primeiro, então uma conta que já possui uma credencial WebAuthn prova isso com essa credencial.

  • A conta precisa de um endereço de email verificado ou é recusada com 403 MFA_EMAIL_VERIFICATION_REQUIRED.
  • Uma conta que já possui o TOTP ativado é recusada com 400 TWO_FA_NOT_ENABLED.

O corpo estende o objeto de verificação sudo com os campos abaixo, e uma prova sudo existente é enviada no cabeçalho de requisição X-Fluxer-Sudo-Mode-JWT.

CampoTipoDescrição
secret1stringSegredo TOTP em Base32 (1-256 caracteres)
code2stringCódigo TOTP atual gerado a partir do segredo enviado (1-32 caracteres)

1 Gerado pelo cliente e armazenado literalmente (verbatim) na conta 2 Um código de backup é rejeitado aqui

StatusCorpoCondição
200objeto de códigos de backup MFAO TOTP foi ativado e 10 códigos de backup foram emitidos
400resposta de erroO código TOTP não correspondeu ao segredo enviado, retornando INVALID_CODE no caminho code, ou o TOTP já está ativado e a requisição retorna TWO_FA_NOT_ENABLED
403resposta de erroO email da conta não está verificado e a requisição retorna MFA_EMAIL_VERIFICATION_REQUIRED, ou o modo sudo não foi provado e a requisição retorna SUDO_MODE_REQUIRED

O TOTP é ativado e 10 códigos de backup são emitidos. Qualquer código de backup que a conta já possuía permanece no lugar, então a resposta tem apenas os 10 novos códigos. O Decoding Chat também copia os tipos de autenticador da conta para cada conta de bot que o usuário possui. A Atualização de Usuário chega às sessões do usuário e a cada bot possuído cujos tipos de autenticador mudaram.

10 requisições por minuto para cada usuário autenticado, no bucket user:mfa:totp:enable.

POST/v1/users/@me/mfa/totp/disableMFA

Desativa o TOTP para a conta atual e retorna 204 com o corpo vazio. O modo sudo é obrigatório. Emite um evento de Gateway Atualização de Usuário.

O Decoding Chat verifica um código de autenticador ou código de backup para cada requisição. Com um token sudo válido, ele verifica code. Sem um, os campos de verificação sudo provam o modo sudo quando mfa_method está definido, e o Decoding Chat não verifica code. Caso contrário, code prova o modo sudo como se fosse mfa_code com mfa_method definido como totp, para que a tentativa consuma a permissão TOTP descrita em modo sudo.

O TOTP já deve estar ativado, ou a requisição é recusada com 400 TWO_FACTOR_REQUIRED. Um email verificado não é obrigatório, portanto uma conta cujo endereço se tornou não verificado posteriormente ainda pode remover seu autenticador.

O corpo estende o objeto de verificação sudo com o campo abaixo, e uma prova sudo existente é enviada no cabeçalho de requisição X-Fluxer-Sudo-Mode-JWT.

CampoTipoDescrição
code1stringCódigo TOTP atual ou um código de backup não consumido (1-32 caracteres)

1 Um valor errado retorna INVALID_CODE no caminho code com um token sudo, e INVALID_MFA_CODE no caminho mfa_code quando code prova o modo sudo

StatusCorpoCondição
204vazioO TOTP foi desativado
400resposta de erroO código não correspondeu, ou o TOTP não está ativado e a requisição retorna TWO_FACTOR_REQUIRED
403resposta de erroO modo sudo não foi provado e a requisição retorna SUDO_MODE_REQUIRED

O TOTP é desativado e todos os códigos de backup param de funcionar. O Decoding Chat remove o tipo de autenticador TOTP, juntamente com o valor legado não atribuído de autenticador 1 caso a conta ainda o mantenha. O Decoding Chat também copia os tipos de autenticador da conta para cada conta de bot que o usuário possui. A Atualização de Usuário vai para as sessões do usuário e a cada bot possuído cujos tipos de autenticador mudaram.

10 requisições por minuto para cada usuário autenticado, no bucket user:mfa:totp:disable.

POST/v1/users/@me/mfa/backup-codesMFA

Retorna um objeto de códigos de backup MFA, substituindo primeiro o conjunto quando regenerate for verdadeiro (true). O modo sudo é obrigatório.

Nem um email verificado nem um autenticador são necessários, de modo que uma conta sem nenhum MFA pode provar o modo sudo com sua senha e usar esta operação.

Um código de backup enviado como mfa_code para satisfazer o modo sudo é consumido. Com regenerate falso, ele retorna com consumed definido como verdadeiro. Com regenerate verdadeiro, ele é excluído junto com o resto do conjunto anterior e não aparece.

O corpo estende o objeto de verificação sudo com o campo abaixo, e uma prova sudo existente é enviada no cabeçalho de requisição X-Fluxer-Sudo-Mode-JWT.

CampoTipoDescrição
regenerate1booleanSe o conjunto atual deve ser descartado e emitir 10 substitutos

1 O campo é obrigatório. Passar false lê o conjunto atual sem alterá-lo

StatusCorpoCondição
200objeto de códigos de backup MFAOs códigos atuais ou substitutos foram retornados
403resposta de erroO modo sudo não foi provado e a requisição retorna SUDO_MODE_REQUIRED

6 requisições por minuto para cada usuário autenticado, no bucket user:mfa:backup_codes.

POST/v1/users/@me/mfa/backup-codes/challenge

Cria um ticket de desafio de códigos de backup e envia um código de verificação para o endereço de email da conta. Retorna um objeto de desafio de códigos de backup MFA em caso de sucesso.

O modo sudo não é obrigatório, e a rota não lê nenhum campo de verificação sudo.

O envio consome o controle de início do desafio.

  • A conta precisa de um endereço de email verificado e é recusada de outra forma com 403 MFA_EMAIL_VERIFICATION_REQUIRED.
  • Uma conta que não possui nenhum endereço de email é recusada com 400 INVALID_FORM_BODY e o código de validação USER_DOES_NOT_HAVE_AN_EMAIL_ADDRESS no caminho email.
  • A conta precisa do TOTP ativado e é recusada de outra forma com 400 TWO_FACTOR_REQUIRED.

O corpo pode ser omitido, e qualquer corpo fornecido é um objeto sem campos. O Decoding Chat remove chaves desconhecidas antes de processar a requisição.

StatusCorpoCondição
200objeto de desafio de códigos de backup MFAO ticket foi criado e um código foi enviado
400resposta de erroO TOTP não está ativado e a requisição retorna TWO_FACTOR_REQUIRED, ou a conta não possui nenhum endereço
403resposta de erroO email da conta não está verificado e a requisição retorna MFA_EMAIL_VERIFICATION_REQUIRED

O Decoding Chat armazena um ticket contendo o código e sua data de validade, e um email de verificação é enviado para o endereço da conta. Nenhum campo da conta é alterado e nenhum código de backup é emitido.

6 requisições por minuto para cada usuário autenticado, no bucket user:mfa:backup_codes_challenge:start.

Reenviar código de desafio de códigos de backup MFA

Seção intitulada “Reenviar código de desafio de códigos de backup MFA”
POST/v1/users/@me/mfa/backup-codes/challenge/resend

Envia um novo código de verificação para um ticket ativo de desafio de códigos de backup. Retorna 204 com o corpo vazio.

A rota lê apenas o ticket e o endereço da conta. Uma conta que não possui nenhum endereço de email é recusada com 400 INVALID_FORM_BODY e o código de validação USER_DOES_NOT_HAVE_AN_EMAIL_ADDRESS no caminho email.

O envio consome o controle de reenvio do desafio, e o ticket impõe seu próprio tempo de espera (cooldown) de 30 segundos.

CampoTipoDescrição
ticketstringO identificador retornado por Iniciar desafio de códigos de backup MFA (1-256 caracteres)
StatusCorpoCondição
204vazioUm código substituto foi enviado
400resposta de erroO ticket é desconhecido e a requisição retorna INVALID_OR_EXPIRED_TICKET

O Decoding Chat substitui o código do ticket, o tempo de envio e o tempo de expiração do código, o que invalida o código anterior. A prova armazenada é limpa e um email de verificação vai para o endereço da conta.

6 requisições por minuto para cada usuário autenticado, no bucket user:mfa:backup_codes_challenge:resend.

Verificar código de desafio de códigos de backup MFA

Seção intitulada “Verificar código de desafio de códigos de backup MFA”
POST/v1/users/@me/mfa/backup-codes/challenge/verify

Verifica o código enviado por email e retorna um objeto de verificação de códigos de backup MFA contendo os códigos atuais e uma prova.

A verificação consome o código. Um ticket que não contém código falha com VERIFICATION_CODE_NOT_ISSUED, que é o que uma segunda verificação do mesmo ticket retorna. Um código além de seu tempo de vida de 10 minutos falha com VERIFICATION_CODE_EXPIRED. Uma incompatibilidade falha com INVALID_VERIFICATION_CODE.

O Decoding Chat cobra a permissão de verificação por ticket antes de ler o código, de forma que tanto um código incorreto quanto um código correto consomem dessa permissão.

CampoTipoDescrição
ticketstringO identificador retornado por Iniciar desafio de códigos de backup MFA (1-256 caracteres)
codestringO código enviado ao endereço da conta (1-256 caracteres)
StatusCorpoCondição
200objeto de verificação de códigos de backup MFAO código foi aceito
400resposta de erroO ticket retorna INVALID_OR_EXPIRED_TICKET, ou o código não foi emitido, expirou ou não correspondeu

O ticket armazena uma nova prova e seu código é limpo. A resposta contém todos os códigos de backup da conta, incluindo os consumidos. Nenhum código de backup é emitido, consumido ou excluído.

20 requisições por minuto para cada usuário autenticado, no bucket user:mfa:backup_codes_challenge:verify.

POST/v1/users/@me/mfa/backup-codes/challenge/regenerate

Substitui os códigos de backup da conta por 10 novos e retorna um objeto de códigos de backup MFA. O modo sudo não é obrigatório.

O ticket e sua prova são a única autorização. Sem o TOTP ativado, a requisição é recusada com 400 TWO_FACTOR_REQUIRED.

Um ticket sem nenhuma prova retorna INVALID_OR_EXPIRED_TICKET no caminho verification_proof, e uma prova que não corresponde retorna INVALID_PROOF_TOKEN.

CampoTipoDescrição
ticketstringO identificador retornado por Iniciar desafio de códigos de backup MFA (1-256 caracteres)
verification_proofstringA prova emitida por Verificar código de desafio de códigos de backup MFA (1-256 caracteres)
StatusCorpoCondição
200objeto de códigos de backup MFAO conjunto anterior foi excluído e 10 substitutos foram emitidos
400resposta de erroO TOTP não está ativado e a requisição retorna TWO_FACTOR_REQUIRED, ou o ticket ou a prova foi rejeitado

O conjunto anterior é substituído por 10 novos códigos. Uma falha pode deixar os códigos antigos inutilizáveis. Os tipos de autenticador permanecem inalterados e nenhum evento do Gateway é emitido.

6 requisições por minuto para cada usuário autenticado, no bucket user:mfa:backup_codes_challenge:regenerate.

GET/v1/users/@me/mfa/webauthn/credentials

Retorna um array de objetos de credencial WebAuthn registrados para a conta atual, ou um array vazio quando não houver nenhum. O modo sudo não é obrigatório.

StatusCorpoCondição
200array[objeto de credencial WebAuthn]As credenciais foram retornadas

40 requisições a cada 10 segundos para cada usuário autenticado, no bucket mfa:webauthn:list.

POST/v1/users/@me/mfa/webauthn/credentials/registration-optionsMFA

Cria um desafio de registro de uso único e retorna um objeto de opções de registro WebAuthn. O modo sudo é obrigatório.

Esta operação não define o cabeçalho de resposta X-Fluxer-Sudo-Mode-JWT.

  • A conta precisa de um endereço de email verificado.
  • Uma conta que já possui 10 credenciais recebe 400 WEBAUTHN_CREDENTIAL_LIMIT_REACHED e nenhum desafio.

O corpo é um objeto de verificação sudo. Uma prova sudo existente é enviada no cabeçalho de requisição X-Fluxer-Sudo-Mode-JWT.

StatusCorpoCondição
200objeto de opções de registro WebAuthnO desafio e as opções de registro foram emitidos
400resposta de erro10 credenciais já estão registradas e a requisição retorna WEBAUTHN_CREDENTIAL_LIMIT_REACHED
403resposta de erroO email da conta não está verificado e a requisição retorna MFA_EMAIL_VERIFICATION_REQUIRED, ou o modo sudo não foi provado e a requisição retorna SUDO_MODE_REQUIRED

O Decoding Chat emite um desafio de registro para o usuário atual. Ele expira após cinco minutos e pode ser resgatado uma vez.

20 requisições a cada 10 segundos para cada usuário autenticado, no bucket mfa:webauthn:registration_options.

POST/v1/users/@me/mfa/webauthn/credentials

Consome um desafio de registro, adiciona uma credencial WebAuthn à conta atual e retorna 204 com o corpo vazio. Emite um evento de Gateway Atualização de Credenciais WebAuthn, e um evento de Atualização de Usuário quando esta é a primeira credencial WebAuthn da conta.

A conta precisa de um email verificado e ter menos de 10 credenciais registradas. Esta rota não aceita nenhum campo de verificação sudo próprio. O Decoding Chat verifica o atestado em relação ao identificador da parte confiável da instância e suas origens permitidas, e não exige verificação de usuário.

CampoTipoDescrição
responseobjeto de resposta de registro WebAuthnResposta do autenticador para o desafio de registro
challengestringDesafio de registro de uso único (1-1024 caracteres)
namestringNome da credencial atribuído pelo usuário (1-100 caracteres)
StatusCorpoCondição
204vazioA credencial foi registrada
400resposta de erroO desafio ou o atestado falhou e a requisição retorna INVALID_WEBAUTHN_CREDENTIAL, a chave pública retorna INVALID_WEBAUTHN_PUBLIC_KEY_FORMAT, o contador de assinaturas retorna INVALID_WEBAUTHN_CREDENTIAL_COUNTER ou o limite retorna WEBAUTHN_CREDENTIAL_LIMIT_REACHED
403resposta de erroO email da conta não está verificado e a requisição retorna MFA_EMAIL_VERIFICATION_REQUIRED

A credencial é adicionada à conta. Quando for a primeira credencial WebAuthn da conta, o Decoding Chat também copia os tipos de autenticador da conta, que agora incluem WebAuthn, para cada conta de bot que o usuário possui.

A Atualização de Credenciais WebAuthn chega às sessões do usuário com os resumos completos das credenciais atuais. Quando os tipos de autenticador mudam, a Atualização de Usuário também chega ao usuário e a cada bot possuído afetado.

10 requisições por minuto para cada usuário autenticado, no bucket mfa:webauthn:register.

PATCH/v1/users/@me/mfa/webauthn/credentials/{credential_id}MFA

Altera o nome atribuído pelo usuário de uma credencial WebAuthn pertencente à conta atual e retorna 204 com o corpo vazio. O modo sudo é obrigatório. Emite um evento de Gateway Atualização de Credenciais WebAuthn.

Um email verificado não é obrigatório.

CampoTipoDescrição
credential_idstringID da credencial em Base64url registrada para a conta atual (1-2048 caracteres)

O corpo estende o objeto de verificação sudo com o campo abaixo, e uma prova sudo existente é enviada no cabeçalho de requisição X-Fluxer-Sudo-Mode-JWT.

CampoTipoDescrição
namestringNome de credencial substituto (1-100 caracteres)
StatusCorpoCondição
204vazioA credencial foi renomeada
403resposta de erroO modo sudo não foi provado e a requisição retorna SUDO_MODE_REQUIRED
404resposta de erroA credencial não está registrada na conta atual, retornando UNKNOWN_WEBAUTHN_CREDENTIAL

O nome da credencial é substituído e nenhum tipo de autenticador é alterado. A Atualização de Credenciais WebAuthn chega às sessões do usuário atual com os resumos completos das credenciais atuais.

20 requisições a cada 10 segundos para cada usuário autenticado, no bucket mfa:webauthn:update.

DELETE/v1/users/@me/mfa/webauthn/credentials/{credential_id}MFA

Exclui uma credencial WebAuthn pertencente à conta atual e retorna 204 com o corpo vazio. O modo sudo é obrigatório. Emite um evento de Gateway Atualização de Credenciais WebAuthn, e um evento de Atualização de Usuário quando esta era a última credencial WebAuthn da conta.

Um email verificado não é obrigatório.

CampoTipoDescrição
credential_idstringID da credencial em Base64url registrada para a conta atual (1-2048 caracteres)

O corpo é um objeto de verificação sudo. Uma prova sudo existente é enviada no cabeçalho de requisição X-Fluxer-Sudo-Mode-JWT.

StatusCorpoCondição
204vazioA credencial foi excluída
403resposta de erroO modo sudo não foi provado e a requisição retorna SUDO_MODE_REQUIRED
404resposta de erroA credencial não está registrada na conta atual, retornando UNKNOWN_WEBAUTHN_CREDENTIAL

A credencial é excluída. Quando era a final, o tipo de autenticador WebAuthn também é removido de cada conta de bot que o usuário possui.

A Atualização de Credenciais WebAuthn chega às sessões do usuário com os resumos das credenciais restantes. Quando os tipos de autenticador mudam, a Atualização de Usuário também chega ao usuário e a cada bot possuído afetado.

10 requisições por minuto para cada usuário autenticado, no bucket mfa:webauthn:delete.

GET/v1/users/@me/sudo/mfa-methods

Retorna um objeto de métodos MFA sudo descrevendo quais desafios sudo a conta atual pode responder. O modo sudo não é obrigatório.

StatusCorpoCondição
200objeto de métodos MFA sudoOs métodos disponíveis foram retornados

20 requisições por minuto para cada usuário autenticado, no bucket sudo:mfa:methods.

POST/v1/users/@me/sudo/webauthn/authentication-options

Cria um desafio sudo de uso único e retorna um objeto de opções de autenticação WebAuthn listando todas as credenciais registradas na conta atual.

A conta precisa de pelo menos uma credencial WebAuthn registrada. O modo sudo não é obrigatório para obter o desafio.

StatusCorpoCondição
200objeto de opções de autenticação WebAuthnO desafio e as opções foram emitidos
400resposta de erroNenhuma credencial WebAuthn está registrada e a requisição retorna NO_PASSKEYS_REGISTERED

O Decoding Chat emite um desafio sudo para o usuário atual. Ele expira após cinco minutos e pode ser resgatado uma vez ao enviá-lo como webauthn_challenge ao lado de webauthn_response em um objeto de verificação sudo.

10 requisições por minuto para cada usuário autenticado, no bucket sudo:webauthn:options.