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

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

No Chrome 116, o Chrome está lançando os três novos recursos de gerenciamento de credenciais federadas (FedCM, na sigla em inglês) abaixo:

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

Além disso, o Chrome está iniciando um teste de origem para a API Status de login do IdP. A API Status de login do IdP é um requisito e será uma mudança de interrupção 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 que fizeram login.

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 se autentique novamente. No entanto, o usuário pode não ter certeza de qual conta está usando. Se o RP puder especificar com qual conta fazer login, será mais fácil para o usuário escolher uma conta. A dica de login foi lançada no Chrome 116. Com ela, o RP pode restringir a lista a uma única opção.

Essa extensão adiciona uma matriz de login_hints na resposta do endpoint da lista de contas do IdP, com todos os tipos de filtro possíveis aceitos pelo IdP. Por exemplo, a resposta das contas pode ser semelhante a esta quando um IdP oferece suporte à 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, o RP pode invocar navigator.credentials.get() com a propriedade loginHint, conforme mostrado no exemplo de código abaixo 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

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

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 e renderizar o botão, ele não estará disponível quando os cookies de terceiros forem descontinuados.

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

A API precisa ser chamada pelo IdP em um iframe incorporado no site do RP para recuperar as informações do usuário e renderizar um botão personalizado como se ele fizesse parte da plataforma. 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 pelo FedCM no passado na mesma instância do navegador e os dados não foram limpos.
  • 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() em um iframe com a mesma origem do IdP, o HTML de incorporação precisa permitir explicitamente isso com a política de permissões identity-credentials-get.

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

Confira em ação em https://fedcm-rp-demo.glitch.me/button.

API Contexto do RP

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

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

O uso é simples: forneça a propriedade identity.context como "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 Status de login do IdP

O Chrome inicia um teste de origem da API Status de login do IdP no computador a partir do Chrome 116, seguido pelo Chrome para Android. Os testes de origem dão acesso a um recurso novo ou experimental para criar funcionalidades que os usuários podem testar por tempo limitado antes de serem disponibilizados para todos.

A API Status de login do IdP é um mecanismo em que um IdP informa ao navegador o status de login do usuário no IdP. Com essa API, o navegador pode reduzir solicitações desnecessárias ao IdP e mitigar possíveis ataques de sincronização.

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 faz login no IdP ou quando ele sai de todas as contas do IdP. O navegador registra o status como um dos seguintes: "login", "sair" ou "desconhecido" (padrão).

Para indicar que o usuário fez login, envie um cabeçalho HTTP IdP-SignIn-Status: action=signin em uma navegação de nível superior ou uma solicitação de subrecurso de mesma origem:

IdP-SignIn-Status: action=signin

Também é possível chamar a API JavaScript IdentityProvider.login() da origem do provedor de identidade:

IdentityProvider.login()

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

Para indicar que o usuário foi 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 subrecurso de mesma origem:

IdP-SignIn-Status: action=signout-all

Também é possível chamar a API JavaScript IdentityProvider.logout() da origem do provedor de identidade:

IdentityProvider.logout()

Elas vão registrar o status de login do usuário como "sair". Quando o status de login do usuário é "desconectado", a chamada para o FedCM falha silenciosamente sem fazer uma solicitação para o 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 sinal usando a API Status de login do IdP. Esse status foi introduzido para melhorar a 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 para o navegador até que o FedCM seja invocado pela primeira vez. Nesse caso, fazemos uma solicitação para o endpoint de lista de contas do IdP e atualizamos o status com base na resposta do endpoint de lista de contas:

  • Se o endpoint retornar uma lista de contas ativas, atualize o status para "fazer 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 a chamada do FedCM.

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

Mesmo que o IdP continue informando o navegador sobre o status de login do usuário, ele pode ficar desincronizado, por exemplo, quando a sessão expira. O navegador tenta enviar uma solicitação com credenciais 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 que o usuário faça login no IdP dinamicamente por uma janela pop-up.

A caixa de diálogo FedCM vai mostrar uma mensagem, conforme mostrado na imagem a seguir:

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

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

Uma janela pop-up exibida depois de clicar no botão &quot;Fazer login no IdP&quot;.
Uma janela pop-up mostrada após 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 de navegador comum que usa cookies próprios. O que acontece na janela de conteúdo é de responsabilidade do provedor de identidade, mas nenhum identificador de janela está disponível para fazer uma solicitação de comunicação entre origens para a página do RP. Depois que o usuário fizer 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 um RP depois de fazer login no IdP usando o FedCM

Teste o comportamento da API Status de login do provedor de identidade na nossa demonstração. A sessão expira em três minutos após você fazer login no IdP de demonstração. Em seguida, observe o login no IdP pelo comportamento da janela pop-up.

Participar do teste de origem

Para testar a API Status de login do provedor de identidade localmente, ative uma flag
do Chrome
chrome://flags#fedcm-idp-signin-status-api no
Chrome 116 ou 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 a usabilidade, praticidade e eficácia deles para a comunidade de padrões da Web. Para mais informações, consulte o Guia de testes de origem para desenvolvedores da Web.

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

Registrar um teste de origem para o IdP

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

Registrar um teste de origem de terceiros para o RP

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

Para incorporar o token em um site de terceiros, adicione o código abaixo à biblioteca JavaScript ou ao SDK veiculado pela 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.

Engajamento e compartilhamento de feedback

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

Foto de Dan Cristian Pădureț no Unsplash