Google Sign in para Web com FedCM API - Caso de implementação

Contextualização

Imagine o seguinte cenário: Surgiu a necessidade de atualização de scripts de login web com objetivo de diminuir a quantidade de erros no login e um dos principais meios de login social é o Google Sign In - exatamente, aquele botãozinho que abre uma janela de login do Google. Sem problemas até então.

Seu primeiro passo é ler a documentação do Sign in with Google for Web.

O segundo passo é conferir como está a implementação atual e, para sua surpresa, ela está com o script atualizado segundo a própria documentação.

src="https://accounts.google.com/gsi/client" async

No entanto, seus usuários não estão recebendo a “nova experiência de login” como o Google prometeu.

Google FedCM login flow

Como lidar?

O que é a FedCM API

Vamos dar dois passos para trás e falar sobre essa API se suma importância pra nossa análise.

FedCM significa Federated Credential Management e existe uma API no browser para isso. Essa API fornece um mecanismo padrão para provedores de identidade (IdPs) disponibilizarem serviços de federação de identidade na web de forma a preservar a privacidade, sem a necessidade de cookies e redirecionamentos de terceiros - essa é a parte mais importante.

Então, podemos dizer que o Google é maravilhoso e está na vanguarda trilhando um caminho para uma web mais segura? Sim! Ruim é a maneira que está acontecendo neste caso 😅, vamos avançar.

Compatibilidade do FedCM

A próxima etapa é dar uma olhada na compatibilidade nos navegadores por meio da MDN Web Docs.

MDN Web Docs - FedCM API Compatibility

Podemos observar que:

Esse é o momento que você deve se perguntar:

O que a W3C diz sobre o FedCM?

No site oficial da W3C a proposta está com status First Public Working Draft. O que indica que podem surgir mudanças em como ela é implementada.

A sequência pela W3C do processo é a seguinte:

Em outras palavras, está bem longe.

Primeiras impressões

Então, o que podemos deduzir só de pesquisa até o momento, sem testes de implementação?

Sobre o Google

Aparentemente o Google não se importa com as pessoas que utilizam browsers que tenham um motor diferente do Chromium e eles estão dispostos a fazer essa mudança mesmo sabendo que o FedCM é uma API em estado experimental. Uma conversa recente entre alguns usuários no Reddit sobre isso.

Sobre a migração

O próprio guia do FedCM Migration diz:

Para a maioria dos sites, a migração ocorre sem problemas com atualizações compatíveis com versões anteriores para a biblioteca JavaScript dos Serviços de Identificação do Google.

A implementação

Agora chega de especulações, vamos a implementação.

Seguindo a documentação

Se faz necessário passar os parâmetros corretos, então siga a documentação Exibir o botão Fazer login com o Google.

Verificando métodos disponíveis no navegador

Quando fiz a implementação acabei colocando uma função de verificação de todos os métodos de API necessários para autenticação com FedCM. Ela retorna um booleano que utilizo para passar os parâmetros do FedCM ou não, conforme o caso.

/**
 * Verify FedCM API browser support.
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/FedCM_API MDN Documentation}
 * @returns {boolean}
 */
export const isFedCMApiAvailable = () => {
  return (
    "FederatedCredential" in window &&
    "IdentityCredential" in window &&
    "IdentityProvider" in window &&
    "NavigatorLogin" in window &&
    "CredentialsContainer" in window &&
    typeof window?.navigator?.login?.setStatus === "function"
  );
};

Detalhes da implementação

Existem alguns detalhes de implementação que enfrentamos e temos que entender:

Tabela de resultados

PlataformaNavegadorLogin (com conta)Cadastro (sem conta)Observações
UbuntuChrome 130SucessoErro
UbuntuChrome 135SucessoErro
UbuntuFirefox 138ErroSucesso
AndroidEdge-Erro403 + loop de autenticação
Browser StackSafariErrorError
AndroidSamsung InternetSucessoSucesso
AndroidOpera-Sucesso
AndroidBrave-Erro

Conclusão

No atual cenário, apesar da função de verificação alguns fluxos não funcionam como o esperado.

A consequência seria fricção para o usuário e aumento de erros de login, portanto, chegamos a conclusão que não é o momento para realizar essa implementação e essa decisão pode ser revisitada no futuro.