Pular para o conteúdo

Login hospedado

As telas de login que o Authio serve para cada client: as etapas que pedem, a aparência, os idiomas e como o login volta para a sua aplicação.

Cada client ganha um conjunto de telas que o Authio hospeda e desenha no servidor: login, segundo fator, esqueci a senha, termos, consentimento, logout e as páginas da conta. A sua aplicação nunca recebe uma senha. Ela envia o navegador ao endpoint de autorização do realm, e o Authio conduz a pessoa por tudo o que o client foi configurado para pedir.

Esta página explica como um login acontece, as etapas que você compõe por client, o que a pessoa vê, a marca e os idiomas, e como rodar o login num popup em vez de um redirecionamento completo.

Como um login acontece

  1. A sua aplicação envia um pedido de autorização

    Um pedido authorization code com PKCE padrão, enviado ao endpoint de autorização do realm. Qualquer biblioteca OpenID Connect monta esse pedido para você:

    Pedido de autorizaçãoTexto simples
    https://authio.api.hyperio.tech/realms/acme/protocol/openid-connect/auth
      ?client_id=acme-web
      &response_type=code
      &redirect_uri=http://localhost:3000/api/auth/callback/authio
      &scope=openid profile email
      &state=STATE
      &code_challenge=CODE_CHALLENGE
      &code_challenge_method=S256
  2. O Authio procura uma sessão que possa reaproveitar

    Se o client participa do single sign-on e o navegador já tem um login válido no realm, a pessoa passa direto ou escolhe uma conta no seletor. Caso contrário, o navegador chega à tela de login do client, /realms/acme/clients/acme-web/login, levando o pedido inteiro junto.

  3. O login hospedado executa as etapas do client

    Senha, passkey, um botão de provedor e, depois, o segundo fator que o client ainda exigir. Comprovada a credencial, o Authio aplica as verificações do realm nesta ordem: suspensão, situação da conta e acesso a este client, endereço de origem do login, expiração da senha e, só então, o segundo fator.

  4. Termos e consentimento, quando o client pede

    Com a conta definida, o pedido volta pelo endpoint de autorização. A tela de termos vem primeiro, se a conta ainda não aceitou a versão vigente, e depois a de consentimento, se o client pede consentimento e algum escopo ainda não foi concedido.

  5. O navegador volta para a sua aplicação

    O Authio redireciona para a redirect URI registrada com code, state e iss. A sua aplicação troca o código por tokens como de costume.

O pedido nunca se perde entre as etapas

O Authio guarda o pedido de autorização original durante todo o login, inclusive nas etapas conduzidas por script, como a cerimônia da passkey ou a aprovação por push, e o retoma quando a última etapa termina. O endereço de retorno é sempre o registrado no client, nunca um tirado da barra de endereços.

Etapas do login

Cada client escolhe, em ordem, de quais etapas o seu login é feito. Clients do mesmo realm podem ser diferentes: um pede só senha, outro uma passkey, um terceiro senha mais aprovação no celular.

EtapaO que pedeObservações
loginNome de usuário e senha.A única etapa que admite uma conta sem nada cadastrado. Os botões de provedores aparecem embaixo dela.
mfaUm código de 6 dígitos enviado ao e-mail da conta.Pedida depois de um primeiro fator; o mesmo código também chega aos celulares pareados da conta. Veja Multifator.
passkeyUma passkey neste dispositivo: digital, rosto, bloqueio de tela ou chave de segurança.Funciona como primeira etapa ou como segundo fator. Veja Passkeys.
pushUma aprovação no app do Authio, conferindo um número mostrado na tela.Sempre um segundo fator. Veja Multifator.
terms_acceptanceO aceite da versão vigente dos termos do client.Sempre pedida depois do login, onde quer que esteja na lista. Veja Sessões e SSO.

Exigência e cadastro

As etapas passkey e push têm duas configurações. Exigência diz o quanto a etapa é pedida; Cadastro diz o que acontece com uma conta que ainda não tem o fator.

ConfiguraçãoValorEfeito
ExigênciaPreferencial (padrão)Pedida só de contas que já conseguem responder: com passkey registrada ou celular pareado.
ExigênciaOpcionalNunca bloqueia um login. Um pedido de autorização com acr_values pode elevá-la a Preferencial.
ExigênciaObrigatóriaPedida de toda conta, inclusive de uma sem nada cadastrado.
CadastroOferecer (padrão)Uma conta sem o fator recebe a oferta de configurá-lo e pode recusar.
CadastroNuncaNada é oferecido durante o login; o fator é configurado pelas páginas da conta.
CadastroExigirA conta precisa configurar o fator antes de continuar.

Combinações que trancariam pessoas do lado de fora são recusadas ao salvar o client, com o motivo no campo:

  • Etapa Obrigatória com cadastro Nunca num client que tem a etapa login: uma conta sem o fator nunca conseguiria entrar.
  • Etapa Opcional com cadastro Exigir: a conta cadastraria um fator que nunca é pedido.
  • Etapa mfa marcada como Opcional: o código nunca seria enviado. Remova a etapa em vez disso.
  • Etapa que oferece cadastro num client sem a etapa login: não há sessão a partir da qual cadastrar, então defina o cadastro como Nunca.

Configurar as etapas

  1. Abra a tela de login do client

    Em Clients, abra o client, escolha Editar e depois o passo Tela de login. As etapas vêm primeiro, de cima para baixo na ordem em que a tela as pede.

  2. Adicione, remova e ordene as etapas

    Mova cada etapa para cima ou para baixo e defina Exigência e Cadastro para passkey e push. O aceite de termos é um interruptor à parte, marcado Depois do login; os documentos e a versão ficam na Configuração do client.

  3. Salve

    As etapas novas valem a partir do próximo login. Um client que usa o fluxo authorization code precisa de pelo menos uma etapa; sem ela, o salvamento é recusado.

O que a pessoa vê

Em volta das etapas, a tela de login oferece:

  • Continuar conectado, que mantém a sessão depois que o navegador fecha.
  • Esqueceu a senha?, que abre a redefinição de senha deste client.
  • Um botão Continuar com … para cada provedor de identidade que o client oferece, embaixo do botão de entrar.
  • Preenchimento automático de passkey no campo de usuário, quando o client também tem a etapa passkey.
  • Começar de novo, que descarta o que foi digitado e reabre a primeira etapa com o mesmo pedido.
  • O seletor de contas, quando o navegador já tem mais de um login reaproveitável.

Um nome de usuário inexistente e uma senha errada recebem a mesma resposta, então a tela nunca revela quais contas existem. Toda outra recusa só aparece depois que a senha foi aceita, e diz o que fazer em seguida:

A pessoa vêPor quêComo se resolve
Esses dados não conferemUsuário ou senha errados.Tentar de novo; falhas seguidas contam para o bloqueio do realm.
Tentativas demaisA conta está bloqueada pelas regras de bloqueio do realm.A mensagem informa a duração; redefinir a senha libera antes.
Endereço ainda não confirmadoO e-mail da conta nunca foi confirmado.A tela oferece reenviar o e-mail de confirmação.
Sem acesso a esta aplicaçãoO client só admite contas vinculadas e esta não está.Um administrador concede o acesso pelos usuários do client.
Confirme este localPrimeiro login a partir de um endereço novo.A tela espera e segue sozinha quando o endereço é aprovado. Veja aprovação de endereço.
Conta suspensaUma suspensão está em vigor.A mensagem diz quando termina, e o motivo se o administrador escolheu mostrá-lo.
Sua senha expirouO realm exige renovação periódica.A pessoa é levada a renová-la por e-mail.
Esta conta não está ativaA assinatura por trás da aplicação venceu.O login volta quando a assinatura é renovada.

Falhas que nenhuma nova tentativa resolve, como um pedido cujo client_id aponta para um client diferente do da tela, substituem o formulário por um cartão de erro com um código de referência que o suporte encontra nos logs.

Marca

Todas as telas hospedadas de um client vestem a aparência dele: login, recuperação, termos, consentimento, erros, verificação de dispositivo e as páginas da conta. Você define a aparência no mesmo passo Tela de login.

ConfiguraçãoO que controlaLimites
DisposiçãoPainel ao lado (painel da marca ao lado do formulário, o padrão), Centralizado (uma coluna, cartão no meio) ou Cobrindo (marca na página inteira, cartão por cima).—
Título e subtítuloOs textos acima do formulário.Até 200 e 500 caracteres.
CoresPrimária, secundária e de fundo, uma vez para o tema claro e outra para o escuro.Hexadecimal #RGB ou #RRGGBB.
Logo e imagem de fundoImagens carregadas de URLs suas. Sem logo, aparece o da plataforma.Até 500 caracteres; a imagem de fundo precisa usar https.
CSS personalizadoRegras próprias por cima das telas.Até 4.000 caracteres, sanitizado (veja abaixo).

O CSS personalizado não pode conter <, expression(, javascript:, vbscript:, behavior: nem -moz-binding, e não pode carregar url() ou @import por http simples. Ele é conferido ao salvar e sanitizado de novo quando a tela é desenhada.

Um recurso do plano

Personalizar a aparência exige um plano que inclua o layout de login personalizado (features.AuthLayoutCustom). Nos demais planos, o console mostra o passo Tela de login travado, com o motivo e um caminho para os planos, e a API recusa mudanças de aparência com AuthLayoutNotIncluded. Veja Planos e cobrança.

Quando um pedido de autorização nomeia uma organização com organization, o logo, a cor primária e a cor de fundo da organização substituem os do client; a disposição, os textos e o CSS continuam os do client.

Claro e escuro

Passe theme=light ou theme=dark no pedido de autorização para escolher a paleta com que as pessoas começam. As telas também têm um botão de alternância; a escolha da própria pessoa fica num cookie e prevalece até o próximo pedido que nomear um tema.

Idiomas

As telas hospedadas estão escritas em inglês (en) e português do Brasil (pt-BR). O idioma é definido uma vez por login e mantido em todas as etapas:

  1. ui_locales no pedido de autorização, uma lista separada por espaços em ordem de preferência.
  2. O cabeçalho Accept-Language do navegador, respeitando os pesos.
  3. Inglês.

Os erros são redigidos a partir do código, no idioma da visita. Toda página hospedada, inclusive as da conta, também aceita ui_locales e theme diretamente no endereço.

Parâmetros que as telas leem

Além dos parâmetros OAuth padrão, estes mudam o que o login hospedado mostra:

ParâmetroValoresEfeito
ui_localesen, pt-BRIdioma de todas as telas do login.
themelight, darkA paleta com que as telas começam.
displaypage (padrão), popuppopup desenha as telas centralizadas, para caber numa janela pequena.
response_modequery (padrão), web_messageweb_message entrega a resposta à janela que abriu o popup.
promptlogin, select_account, consent, nonePede as credenciais de novo, mostra o seletor de contas, mostra a tela de consentimento ou nunca mostra tela.
max_ageSegundosUm login mais antigo que isso é pedido de novo.
acr_values1, 2, 3Pede um login mais forte, em melhor esforço. Veja step-up.
organizationO alias de uma organizaçãoUsa a marca e os provedores de identidade dessa organização.

Para manter a sua página onde está, abra o pedido de autorização numa janela popup. Acrescente display=popup para as telas caberem na janela e response_mode=web_message para que, no fim, o Authio envie a resposta à janela que abriu o popup e o feche, em vez de navegar o popup até a sua redirect URI.

A mensagem é um objeto cujo type é authorization_response e cujo response traz code, state e iss (ou error). Ela é enviada só para a origem da redirect URI que o pedido nomeou, então a página que abre o popup precisa estar nessa origem. Se nenhuma janela estiver esperando — o popup foi aberto como aba, ou quem o abriu saiu da página —, o popup volta a um redirecionamento comum.

sign-in-popup.tsTypeScript
const ISSUER = 'https://authio.api.hyperio.tech/realms/acme'
const AUTHIO_ORIGIN = new URL(ISSUER).origin

export function signInWithPopup(
  state: string,
  codeChallenge: string,
): Promise<Record<string, string>> {
  const authorize = new URL(ISSUER + '/protocol/openid-connect/auth')
  authorize.search = new URLSearchParams({
    client_id: 'acme-web',
    response_type: 'code',
    redirect_uri: 'http://localhost:3000/callback',
    scope: 'openid profile email',
    state,
    code_challenge: codeChallenge,
    code_challenge_method: 'S256',
    display: 'popup',
    response_mode: 'web_message',
  }).toString()

  const popup = window.open(authorize.toString(), 'authio-sign-in', 'popup,width=480,height=720')

  return new Promise((resolve, reject) => {
    if (!popup) {
      reject(new Error('popup_blocked'))
      return
    }

    function onMessage(event: MessageEvent) {
      if (event.origin !== AUTHIO_ORIGIN || event.source !== popup) return
      if (event.data?.type !== 'authorization_response') return

      window.removeEventListener('message', onMessage)
      resolve(event.data.response)
    }

    window.addEventListener('message', onMessage)
  })
}

Confira se o state é o que você enviou e troque o code com o seu verificador PKCE exatamente como depois de um redirecionamento. Chame a função direto de um handler de clique, ou o navegador bloqueia o popup.

No Next.js, o authio-provider-nextauth 2.1.0 em diante traz o fluxo de popup pronto em authio-provider-nextauth/popup, com a troca do código ainda feita pelo Auth.js no seu servidor. Veja Next.js.

De onde vêm as contas

O login hospedado não tem formulário de cadastro aberto ao público. Uma conta chega a um realm de uma destas três formas:

Próximos passos

Cookies de analytics

Gostaríamos de medir como o console é usado, com o Google Analytics, para enxergar em quais telas as pessoas travam. Isso grava um cookie que reconhece este navegador na sua próxima visita.

Recusar não muda mais nada. Os cookies que mantêm você conectado e lembram o seu idioma e o seu tema são necessários para o console funcionar, e ficam de qualquer forma. Ler a Política de Privacidade