Atualizações do FedCM: API Domain Hint

No Chrome 123, você pode usar as Dicas de domínio com a API Federated Credential Management (FedCM). Com a API Domain Hint, os desenvolvedores podem fornecer uma melhor experiência do usuário mostrando apenas as contas de login federadas do domínio que aceitam.

API Domain Hint

A FedCM pode ser usada para facilitar o login de um usuário em uma parte confiável (RP, que se refere a um site) usando as informações da conta fornecidas por um provedor de identidade (IdP). No entanto, há casos em que a parte restrita já sabe que apenas contas associadas a um determinado domínio têm permissão para fazer login no site. Isso é particularmente comum em cenários corporativos em que o site que está sendo acessado está restrito a um domínio corporativo. Para oferecer uma melhor experiência do usuário, a API FedCM permite que a RP mostre apenas as contas que podem ser usadas para fazer login na RP. Isso evita cenários em que um usuário tenta fazer login na RP usando uma conta fora do domínio corporativo, apenas para ser mostrado com uma mensagem de erro posteriormente (ou silenciar quando o login não funcionou) porque o tipo certo de conta não foi usado.

Com a API Domain Hint, os RPs podem especificar uma propriedade domainHint em uma chamada da API FedCM para mostrar apenas contas correspondentes para o usuário. O IdP pode fornecer uma propriedade domain_hints como parte de uma resposta do endpoint da lista de contas para indicar a quais domínios uma conta está associada. Dessa forma, o navegador pode mostrar as contas correspondentes sem divulgar a dica de domínio solicitada ao IdP.

Um exemplo de resposta JSON do endpoint da lista de contas ficaria assim:

{
 "accounts": [{
   "id": "1234",
   "given_name": "John",
   "name": "John Doe",
   "email": "john_doe@idp.example",
   "picture": "https://idp.example/profile/123",
   "approved_clients": ["123", "456", "789"],
  }, {
   "id": "5678",
   "given_name": "Johnny",
   "name": "Johnny",
   "email": "johnny@idp.example",
   "picture": "https://idp.example/profile/456"
   "approved_clients": ["abc", "def", "ghi"],
   "domain_hints": ["corp.example"]
  }]
}

A parte restrita pode chamar navigator.credentials.get() com uma propriedade domainHint para filtrar as contas. Por exemplo, digamos que um usuário visite corp-partner.example e faça login com uma conta do corp.example. O site invocaria a API desta maneira:

return await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: "https://idp.example/manifest.json",
      clientId: "abc",
      nonce: nonce,
      domainHint : "corp.example"
    }]
  }
});

O valor domainHint não é enviado ao endpoint da lista de contas para a filtragem do lado do servidor, já que isso pode ser um vetor de impressão digital para o IdP. Em vez disso, o Chrome executa uma solicitação da FedCM como de costume e filtra as contas que não correspondem ao valor domainHint especificado pela chamada navigator.credentials.get(). Depois, o Chrome mostra a caixa de diálogo da FedCM ao usuário com a nova lista de contas. Essa abordagem é semelhante à API Login Hint, mas essas duas APIs respondem a perguntas diferentes. O objetivo da API Login Hint é responder "qual é o identificador do usuário que eu quero usar?", enquanto a Dica de domínio tem como objetivo responder "a que corporação ou servidor essa conta precisa pertencer?".

Quando domainHint: "any" é usado, o Chrome filtra contas que não têm nenhum domínio (ou seja, domain_hints não é transmitido ou está vazio). Por exemplo, isso possibilita casos de uso em que a parte restrita permite apenas contas gerenciadas no processo de inscrição.

Quando nenhuma conta corresponde a domainHint, a caixa de diálogo "FedCM" mostra uma solicitação de login, que permite ao usuário fazer login em uma conta do IdP correspondente à dica solicitada pela RP. Quando o usuário toca na solicitação, uma janela pop-up é aberta com o URL de login especificado no arquivo de configuração. O link é anexado com a dica de login e os parâmetros de consulta da dica de domínio.

Exemplo de prompt de login quando nenhuma conta corresponde a "domainHint".
Um exemplo de solicitação de login quando nenhuma conta corresponde a domainHint.