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
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 simpleshttps://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=S256O 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.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.
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.
O navegador volta para a sua aplicação
O Authio redireciona para a redirect URI registrada com
code,stateeiss. A sua aplicação troca o código por tokens como de costume.
O pedido nunca se perde entre as etapas
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.
| Etapa | O que pede | Observações |
|---|---|---|
login | Nome de usuário e senha. | A única etapa que admite uma conta sem nada cadastrado. Os botões de provedores aparecem embaixo dela. |
mfa | Um 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. |
passkey | Uma passkey neste dispositivo: digital, rosto, bloqueio de tela ou chave de segurança. | Funciona como primeira etapa ou como segundo fator. Veja Passkeys. |
push | Uma aprovação no app do Authio, conferindo um número mostrado na tela. | Sempre um segundo fator. Veja Multifator. |
terms_acceptance | O 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ção | Valor | Efeito |
|---|---|---|
| Exigência | Preferencial (padrão) | Pedida só de contas que já conseguem responder: com passkey registrada ou celular pareado. |
| Exigência | Opcional | Nunca bloqueia um login. Um pedido de autorização com acr_values pode elevá-la a Preferencial. |
| Exigência | Obrigatória | Pedida de toda conta, inclusive de uma sem nada cadastrado. |
| Cadastro | Oferecer (padrão) | Uma conta sem o fator recebe a oferta de configurá-lo e pode recusar. |
| Cadastro | Nunca | Nada é oferecido durante o login; o fator é configurado pelas páginas da conta. |
| Cadastro | Exigir | A 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
mfamarcada 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
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.
Adicione, remova e ordene as etapas
Mova cada etapa para cima ou para baixo e defina Exigência e Cadastro para
passkeyepush. O aceite de termos é um interruptor à parte, marcado Depois do login; os documentos e a versão ficam na Configuração do client.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 conferem | Usuário ou senha errados. | Tentar de novo; falhas seguidas contam para o bloqueio do realm. |
| Tentativas demais | A 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 confirmado | O e-mail da conta nunca foi confirmado. | A tela oferece reenviar o e-mail de confirmação. |
| Sem acesso a esta aplicação | O client só admite contas vinculadas e esta não está. | Um administrador concede o acesso pelos usuários do client. |
| Confirme este local | Primeiro 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 suspensa | Uma suspensão está em vigor. | A mensagem diz quando termina, e o motivo se o administrador escolheu mostrá-lo. |
| Sua senha expirou | O realm exige renovação periódica. | A pessoa é levada a renová-la por e-mail. |
| Esta conta não está ativa | A 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ção | O que controla | Limites |
|---|---|---|
| Disposição | Painel 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ítulo | Os textos acima do formulário. | Até 200 e 500 caracteres. |
| Cores | Primá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 fundo | Imagens carregadas de URLs suas. Sem logo, aparece o da plataforma. | Até 500 caracteres; a imagem de fundo precisa usar https. |
| CSS personalizado | Regras 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
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:
ui_localesno pedido de autorização, uma lista separada por espaços em ordem de preferência.- O cabeçalho
Accept-Languagedo navegador, respeitando os pesos. - 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âmetro | Valores | Efeito |
|---|---|---|
ui_locales | en, pt-BR | Idioma de todas as telas do login. |
theme | light, dark | A paleta com que as telas começam. |
display | page (padrão), popup | popup desenha as telas centralizadas, para caber numa janela pequena. |
response_mode | query (padrão), web_message | web_message entrega a resposta à janela que abriu o popup. |
prompt | login, select_account, consent, none | Pede as credenciais de novo, mostra o seletor de contas, mostra a tela de consentimento ou nunca mostra tela. |
max_age | Segundos | Um login mais antigo que isso é pedido de novo. |
acr_values | 1, 2, 3 | Pede um login mais forte, em melhor esforço. Veja step-up. |
organization | O alias de uma organização | Usa a marca e os provedores de identidade dessa organização. |
Login num popup
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.
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.
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:
- Criada por um administrador em Usuários ou pela API administrativa.
- Importada de outro provedor. Veja Migração de usuários.
- Criada no primeiro login por um provedor de identidade configurado para criar contas. Veja Login social e corporativo.