Atualizações do FedCM: API IdP Sign-In Status, dicas de login e muito mais

O Chrome 116 inclui recursos do FedCM, como as APIs Login Hint, User Info e RP Context, e inicia um teste de origem para a API IdP Sign-In Status.

No Chrome 116, o Chrome oferece os três novos recursos do Gerenciamento de credenciais federadas (FedCM, na sigla em inglês) a seguir:

  • API Login Hint: especifique uma conta de usuário preferencial para fazer login.
  • API User Info: busque as informações do usuário recorrente para que o provedor de identidade (IdP) possa renderizar um botão de login personalizado em um iframe.
  • API RP Context: use um título diferente de "Fazer login" na caixa de diálogo da FedCM.

Além disso, o Chrome está iniciando um teste de origem para a API IdP Sign-In Status. A API IdP Sign-in Status é um requisito e será uma alteração interruptiva quando for enviada. Se você já tiver uma implementação do FedCM, participe do teste de origem.

API Login Hint

Quando o FedCM é invocado, o navegador mostra a conta conectada do provedor de identidade (IdP) especificado. Quando o IdP oferece suporte a várias contas, ele lista todas as contas conectadas.

Uma caixa de diálogo do FedCM mostrando várias contas de usuário.
Uma caixa de diálogo do FedCM mostrando várias contas de usuário

Depois que o usuário faz login, às vezes a parte confiável (RP) pede que ele faça a autenticação novamente. Mas o usuário pode não ter certeza de qual conta está usando. Se o RP puder especificar com qual conta fazer login, seria mais fácil para o usuário escolher uma conta. A dica de login está sendo enviada no Chrome 116 e, com ela, a RP pode restringir a lista a uma.

Essa extensão adiciona uma matriz de login_hints na resposta do endpoint de lista de contas do IdP com todos os tipos de filtro possíveis compatíveis com o IdP. Por exemplo, a resposta das contas pode ter esta aparência quando um IdP é compatível com a filtragem por e-mail e ID:

{
  "accounts": [{
    "id": "demo1",
    "email": "demo1@example.com",
    "name": "John Doe",
    "login_hints": ["demo1", "demo1@example.com"],
    ...
  }, {
    "id": "demo2",
    "email": "demo2@example.com",
    "name": "Jane Doe",
    "login_hints": ["demo2", "demo2@example.com"],
    ...
  }, ...]
}

Ao transmitir login_hints na lista de contas, a parte restrita pode invocar navigator.credentials.get() com a propriedade loginHint, conforme mostrado no exemplo de código a seguir para mostrar seletivamente a conta especificada:

return await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: "https://idp.example/manifest.json",
      clientId: "123",
      nonce: nonce,
      loginHint : "demo1@example.com"
    }]
  }
});

API User Info

Botões de login decorados com o logotipo do IdP que permitem que os usuários façam login com a federação de identidade agora são comuns. No entanto, decorar o botão usando o ícone de perfil do usuário e as informações dele é ainda mais intuitivo para fazer login, especialmente quando um usuário já se inscreveu neste site com o IdP antes.

Botão "Fazer login com o Google".
Botão "Fazer login com o Google"
Botão "Fazer login com o Google" personalizado.
Botão "Fazer login com o Google" personalizado

O desafio é que, como o botão personalizado depende dos cookies de terceiros no domínio do IdP em um iframe para identificar o usuário conectado para renderizar o botão, ele não estará disponível depois que os cookies de terceiros forem descontinuados.

A API User Info, enviada no Chrome 116, oferece uma maneira para o IdP receber as informações do usuário recorrente do servidor sem depender dos cookies de terceiros.

Espera-se que a API seja chamada pelo IdP em um iframe incorporado no site da RP para que possa recuperar as informações do usuário e renderizar um botão personalizado como se fizesse parte da superfície da RP. Com a chamada de API, o navegador faz uma solicitação ao endpoint da lista de contas e retorna uma matriz de informações do usuário se:

  • O usuário fez login no RP com o IdP via FedCM na mesma instância do navegador, e os dados não foram apagados.
  • O usuário fez login no IdP na mesma instância do navegador.
// Iframe displaying a page from the https://idp.example origin
const user_info = await IdentityProvider.getUserInfo({
    configUrl: "https://idp.example/fedcm.json",
    clientId: "client1234"
});

// IdentityProvider.getUserInfo returns an array of user information.
if (user_info.length > 0) {
  // Chrome puts returning accounts first, so the first account received is guaranteed to be a returning account.
  const name = user_info[0].name;
  const given_name = user_info[0].given_name;
  const display_name = given_name ? given_name : name;
  const picture = user_info[0].picture;
  const email = user_info[0].email;
  // Renders the personalized sign-in button with the information above.
}

Para permitir a chamada de IdentityProvider.getUserInfo() de dentro de um iframe que tenha a mesma origem que o IdP, o HTML de incorporação precisa permitir explicitamente o uso com a política de permissões identity-credentials-get.

<iframe src="https://fedcm-idp-demo.glitch.me" allow="identity-credentials-get"></iframe>

Confira como ele funciona em https://fedcm-rp-demo.glitch.me/button.

API RP Context

A API RP Context, disponibilizada no Chrome 116, permite que um RP modifique a string na interface da caixa de diálogo da FedCM para que ela possa acomodar contextos de autenticação predefinidos. Confira as seguintes capturas de tela para diferentes opções:

Caixa de diálogo &quot;FedCM&quot; renderizada com
Caixa de diálogo do FedCM renderizada com "Fazer login no ****". Essa é a opção padrão se o contexto da RP não for especificado.
Caixa de diálogo &quot;FedCM&quot; renderizada com
Caixa de diálogo do FedCM renderizada com "Inscreva-se no ****"
Caixa de diálogo &quot;FedCM&quot; renderizada com
Caixa de diálogo do FedCM renderizada com "Continue to ****"
Caixa de diálogo &quot;FedCM&quot; renderizada com
Caixa de diálogo do FedCM renderizada com "Use ****"

O uso é simples. Forneça uma propriedade de identity.context entre "signin" (padrão), "signup", "use" ou "continue".

const credential = await navigator.credentials.get({
  identity: {
    // "signin" is the default, "signup", "use" and "continue" 
    // can also be used
    context: "signup", 
    providers: [{
      configURL: "https://idp.example/fedcm.json",
      clientId: "1234",
    }],
  }
});

Teste de origem da API IdP Sign-In Status

No Chrome 116, o Chrome inicia um teste de origem da API Sign-In Status do IdP no computador, seguido pelo Chrome para Android. Os testes de origem oferecem acesso a um recurso novo ou experimental para criar funcionalidades que os usuários podem testar por um tempo limitado antes que o recurso seja disponibilizado para todos.

A API IdP Sign-In Status é um mecanismo em que um IdP informa o navegador sobre o status de login do usuário no IdP. Com essa API, o navegador pode reduzir solicitações desnecessárias para o IdP e possíveis ataques de tempo.

Informar o navegador sobre o status de login do usuário

Os IdPs podem sinalizar o status de login do usuário para o navegador enviando um cabeçalho HTTP ou chamando uma API JavaScript, quando o usuário estiver conectado ao IdP ou quando o usuário estiver desconectado de todas as contas do IdP. O navegador registra o status como um destes: "fazer login", "sair" ou "desconhecido" (padrão).

Para sinalizar que o usuário está conectado, envie um cabeçalho HTTP IdP-SignIn-Status: action=signin em uma navegação de nível superior ou uma solicitação de sub-recurso de mesma origem:

IdP-SignIn-Status: action=signin

Como alternativa, chame a API JavaScript IdentityProvider.login() na origem do IdP:

IdentityProvider.login()

Isso registrará o status de login do usuário como "login". Quando o status de login do usuário é definido como "login", a PR que chama FedCM faz solicitações ao endpoint da lista de contas do IdP e exibe as contas disponíveis para o usuário na caixa de diálogo da FedCM.

Para sinalizar que o usuário está desconectado de todas as contas, envie o cabeçalho HTTP IdP-SignIn-Status: action=signout-all em uma navegação de nível superior ou uma solicitação de sub-recurso de mesma origem:

IdP-SignIn-Status: action=signout-all

Como alternativa, chame a API JavaScript IdentityProvider.logout() na origem do IdP:

IdentityProvider.logout()

Elas registrarão o status de login do usuário como "sair". Quando o status de login do usuário é "out-out", a chamada ao FedCM falha silenciosamente sem fazer uma solicitação ao endpoint da lista de contas do IdP.

Por padrão, o status de login do IdP é definido como "desconhecido". Esse status é usado antes que o IdP envie um indicador usando a API IdP Sign-In Status. Introduzimos esse status para melhor transição porque um usuário pode já ter feito login no IdP quando enviamos essa API, e o IdP pode não ter a chance de sinalizar isso ao navegador no momento em que a FedCM é invocada pela primeira vez. Nesse caso, fazemos uma solicitação para o endpoint da lista de contas do IdP e atualizamos o status com base na resposta desse endpoint:

  • Se o endpoint retornar uma lista de contas ativas, atualize o status para "login" e abra a caixa de diálogo "FedCM" para mostrar essas contas.
  • Se o endpoint não retornar contas, atualize o status para "sair" e falhe na chamada da FedCM.

E se a sessão do usuário expirar? Permitir que o usuário faça login por meio de um fluxo dinâmico de login

Mesmo que o IdP continue informando o navegador sobre o status de login do usuário, ele pode estar fora de sincronia, como quando a sessão expira. O navegador tenta enviar uma solicitação credenciada para o endpoint da lista de contas quando o status de login é "login", mas o servidor a rejeita porque a sessão não está mais disponível. Nesse cenário, o navegador pode permitir dinamicamente que o usuário faça login no IdP por uma janela pop-up.

A caixa de diálogo "FedCM" vai mostrar uma mensagem, como na imagem abaixo:

Uma caixa de diálogo do FedCM sugerindo fazer login no IdP.
Uma caixa de diálogo do FedCM sugerindo fazer login no IdP.

Ao clicar no botão Continuar, o navegador abre uma janela pop-up que envia o usuário para a página de login do IdP.

Uma janela pop-up mostrada depois de clicar no botão de login no IdP.
Uma janela pop-up mostrada depois de clicar no botão de login no IdP.

O URL da página de login, que precisa ser a origem do IdP, pode ser especificado com signin_url como parte do arquivo de configuração do IdP.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "signin_url": "/signin"
  }
}

A janela pop-up é uma janela normal do navegador que usa cookies primários. O que acontece na janela de conteúdo depende do IdP, mas nenhum identificador de janela está disponível para fazer uma solicitação de comunicação de origem cruzada para a página da RP. Depois que o usuário faz login, o IdP precisa:

  • Envie o cabeçalho IdP-SignIn-Status: action=signin ou chame a API IdentityProvider.login() para informar ao navegador que o usuário fez login.
  • Chame IdentityProvider.close() para fechar a janela pop-up.
// User is signed in...
// Don't forget feature detection.
if (IdentityProvider) {
  // Signal to the browser that the user has signed in.
  IdentityProvider.close();
}
Um usuário faz login em uma parte restrita depois de fazer login no IdP usando a FedCM

Teste o comportamento da API IdP Sign-In Status em nossa demonstração. A sessão expira três minutos depois que você faz login no IdP de demonstração. Em seguida, é possível observar o login no IdP pelo comportamento da janela pop-up.

Participar do teste de origem

Para testar a API IdP Sign-In Status localmente, ative uma sinalização
do Chrome
chrome://flags#fedcm-idp-signin-status-api no
Chrome 116 ou versão mais recente.

Também é possível ativar a API IdP Sign-In Status registrando um teste de origem duas vezes:

Os testes de origem permitem que você teste novos recursos e dê feedback sobre usabilidade, praticidade e eficácia para a comunidade de padrões da Web. Para mais informações, confira o Guia de testes de origem para desenvolvedores da Web.

O teste de origem da API IdP Sign-In Status está disponível do Chrome 116 ao 119.

Registrar um teste de origem para o IdP

  1. Acesse a página de registro do teste de origem.
  2. Clique no botão Register e preencha o formulário para solicitar um token.
  3. Digite a origem do IdP como Web Origin.
  4. Clique em Enviar.
  5. Adicione uma tag origin-trial <meta> ao cabeçalho das páginas que usam IdentityProvider.close(). Por exemplo:
    <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">.

Registrar um teste de origem de terceiros para a parte restrita

  1. Acesse a página de registro do teste de origem.
  2. Clique no botão Register e preencha o formulário para solicitar um token.
  3. Digite a origem do IdP como Web Origin.
  4. Marque a opção Correspondência de terceiros para injetar o token com JavaScript em outras origens.
  5. Clique em Enviar.
  6. Incorporar o token emitido em um site de terceiros.

Para incorporar o token a um site de terceiros, adicione o código a seguir à biblioteca JavaScript ou ao SDK disponibilizado na origem do IdP.

const tokenElement = document.createElement('meta');
tokenElement.httpEquiv = 'origin-trial';
tokenElement.content = 'TOKEN_GOES_HERE';
document.head.appendChild(tokenElement);

Substitua TOKEN_GOES_HERE pelo seu próprio token.

Interaja e compartilhe feedback

Se você tiver feedback ou encontrar algum problema durante o teste, compartilhe-o em crbug.com.

Foto de Dan Cristian P Badureē no Unsplash (links em inglês).