Mises à jour FedCM: API Login Status, API Error et API "Auto-selected Flag"

Chrome 120 fournit l'API Login Status pour FedCM. L'API Login Status (anciennement IdP Sign-in Status API) permet aux sites Web, en particulier les fournisseurs d'identité, de signaler au navigateur lorsque leurs utilisateurs se connectent et se déconnectent. Ce signal est utilisé par FedCM pour résoudre un problème d'attaque silencieuse par timing, ce qui lui permet de fonctionner sans cookies tiers. Cette mise à jour corrige les dernières modifications incompatibles avec les versions antérieures que nous avions identifiées dans l'intent d'expédition de FedCM d'origine, dans le cadre de notre champ d'application.

Bien que l'API Login Status améliore la propriété de confidentialité et la facilité d'utilisation, il s'agit d'une modification incompatible avec les versions antérieures une fois expédiée. Si vous disposez déjà d'une implémentation de FedCM, veillez à la mettre à jour en suivant les instructions suivantes.

De plus, Chrome propose deux nouvelles fonctionnalités de Federated Credential Management (FedCM):

  • API Error: avertit les utilisateurs lorsque leur tentative de connexion échoue avec une UI native basée sur la réponse du serveur du point de terminaison de l'assertion d'ID, le cas échéant.
  • API Auto-Selected Flag: informe le fournisseur d'identité (IdP) et le tiers de confiance (RP) si un identifiant a été automatiquement sélectionné dans le flux.

API Login Status

L'API Login Status est un mécanisme grâce auquel un site Web, en particulier un IdP, informe le navigateur de l'état de connexion de l'utilisateur sur le fournisseur d'identité. Grâce à cette API, le navigateur peut réduire le nombre de requêtes inutiles envoyées au fournisseur d'identité et limiter les éventuelles attaques de codes temporels.

Informer le navigateur de l'état de connexion de l'utilisateur

Les fournisseurs d'identité peuvent signaler l'état de connexion de l'utilisateur au navigateur en envoyant un en-tête HTTP ou en appelant une API JavaScript lorsque l'utilisateur est connecté au fournisseur d'identité ou lorsqu'il est déconnecté de tous ses comptes d'IdP. Pour chaque fournisseur d'identité (identifié par son URL de configuration), le navigateur conserve une variable à trois états représentant l'état de connexion avec les valeurs possibles logged-in, logged-out et unknown. L'état par défaut est unknown.

Pour signaler que l'utilisateur est connecté, envoyez un en-tête HTTP Set-Login: logged-in dans une requête de navigation de premier niveau ou une requête de sous-ressource de même origine:

Set-Login: logged-in

Vous pouvez également appeler l'API JavaScript navigator.login.setStatus('logged-in') à partir de l'origine du fournisseur d'identité:

navigator.login.setStatus('logged-in');

Ces appels enregistrent l'état de connexion de l'utilisateur en tant que logged-in. Lorsque l'état de connexion de l'utilisateur est défini sur logged-in, le FedCM qui appelle RP envoie des requêtes au point de terminaison de la liste des comptes du fournisseur d'identité et affiche les comptes disponibles à l'utilisateur dans la boîte de dialogue FedCM.

Pour signaler que l'utilisateur est déconnecté de tous ses comptes, envoyez l'en-tête HTTP Set-Login: logged-out dans une requête de navigation de premier niveau ou une requête de sous-ressource de même origine:

Set-Login: logged-out

Vous pouvez également appeler l'API JavaScript navigator.login.setStatus('logged-out') à partir de l'origine du fournisseur d'identité:

navigator.login.setStatus('logged-out');

Ces appels enregistrent l'état de connexion de l'utilisateur en tant que logged-out. Lorsque l'état de connexion de l'utilisateur est logged-out, l'appel à FedCM échoue silencieusement sans envoyer de requête au point de terminaison de la liste des comptes du fournisseur d'identité.

L'état unknown est défini avant que le fournisseur d'identité n'envoie un signal à l'aide de l'API Login Status. Nous avons introduit cet état pour faciliter la transition, car un utilisateur peut être déjà connecté au fournisseur d'identité lors de la livraison de cette API. L'IdP risque de ne pas pouvoir le signaler au navigateur au moment où FedCM est appelé pour la première fois. Dans ce cas, nous envoyons une requête au point de terminaison de la liste des comptes du fournisseur d'identité et mettons à jour l'état en fonction de la réponse du point de terminaison de la liste des comptes:

  • Si le point de terminaison renvoie une liste de comptes actifs, définissez l'état sur logged-in et ouvrez la boîte de dialogue FedCM pour afficher ces comptes.
  • Si le point de terminaison ne renvoie aucun compte, définissez l'état sur logged-out et échouez à l'appel FedCM.

Que se passe-t-il si la session utilisateur expire ? Autorisez l'utilisateur à se connecter via un flux de connexion dynamique.

Même si le fournisseur d'identité continue d'informer le navigateur de l'état de la connexion de l'utilisateur, cet état peut être désynchronisé, par exemple lorsque la session expire. Le navigateur tente d'envoyer une requête avec identifiants au point de terminaison de la liste des comptes lorsque l'état de la connexion est logged-in, mais le serveur ne renvoie aucun compte, car la session n'est plus disponible. Dans un tel scénario, le navigateur peut autoriser dynamiquement l'utilisateur à se connecter au fournisseur d'identité via une boîte de dialogue.

La boîte de dialogue FedCM affiche un message suggérant une connexion, comme illustré ci-dessous.

Boîte de dialogue FedCM suggérant de se connecter à l'IdP.
Boîte de dialogue FedCM suggérant de se connecter au fournisseur d'identité (IdP).

Lorsque l'utilisateur clique sur le bouton Continue (Continuer), le navigateur ouvre une boîte de dialogue contenant la page de connexion du fournisseur d'identité.

Exemple de boîte de dialogue.
Exemple de boîte de dialogue affichée après un clic sur le bouton de connexion au fournisseur d'identité (IdP).

L'URL de la page de connexion est spécifiée avec login_url dans le fichier de configuration IdP.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "login_url": "/login"
  }
}

Cette boîte de dialogue est une fenêtre de navigateur standard qui contient des cookies propriétaires. Ce qui se passe dans la boîte de dialogue dépend du fournisseur d'identité, et aucun gestionnaire de fenêtre n'est disponible pour envoyer une requête de communication multi-origine à la page du RP. Une fois l'utilisateur connecté, le fournisseur d'identité doit:

  • Envoyez l'en-tête Set-Login: logged-in ou appelez l'API navigator.login.setStatus("logged-in") pour informer le navigateur que l'utilisateur s'est connecté.
  • Appelez IdentityProvider.close() pour fermer la boîte de dialogue.
Un utilisateur se connecte à un tiers assujetti à des restrictions après s'être connecté à l'IdP via FedCM.
Un utilisateur se connecte à un tiers assujetti à des restrictions après s'être connecté à l'IdP via FedCM.

Vous pouvez tester le comportement de l'API Login Status dans notre démonstration.

  1. Appuyez sur le bouton Go to the IdP and sign in (Accéder à l'IdP et se connecter).
  2. Se connecter avec un compte arbitraire
  3. Sélectionnez Session expirée dans le menu déroulant État du compte.
  4. Appuyez sur le bouton Mettre à jour les informations personnelles.
  5. Appuyez sur le bouton Accéder au RP pour essayer FedCM.

Vous devriez pouvoir observer la connexion à l'IdP via le comportement du module.

API Error

Lorsque Chrome envoie une requête au point de terminaison de l'assertion d'ID (par exemple, lorsqu'un utilisateur clique sur le bouton Continuer en tant que dans l'interface utilisateur FedCM ou lorsque la réauthentification automatique est déclenchée), le fournisseur d'identité peut ne pas être en mesure d'émettre un jeton pour des raisons légitimes. Par exemple, si le client n'est pas autorisé, le serveur est temporairement indisponible, et ainsi de suite. Actuellement, Chrome fait échouer la requête en mode silencieux en cas d'erreur et avertit le tiers assujetti à des restrictions uniquement en rejetant la promesse.

Avec l'API Error, Chrome avertit l'utilisateur en affichant une UI native avec les informations d'erreur fournies par le fournisseur d'identité.

Boîte de dialogue FedCM affichant le message d'erreur après l'échec de la tentative de connexion de l'utilisateur. La chaîne est associée au type d'erreur.
Boîte de dialogue FedCM affichant le message d'erreur après l'échec de la tentative de connexion de l'utilisateur. La chaîne est associée au type d'erreur.

API HTTP IdP

Dans la réponse id_assertion_endpoint, le fournisseur d'identité peut renvoyer un jeton au navigateur s'il peut être émis sur demande. Dans cette proposition, si un jeton ne peut pas être émis, l'IdP peut renvoyer une réponse "error" (erreur), qui comporte deux nouveaux champs facultatifs:

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

Pour le code, le fournisseur d'identité peut choisir l'une des erreurs connues dans la liste des erreurs spécifiées par OAuth 2.0 [invalid_request, unauthorized_client, access_denied, server_error et temporarily_unavailable] ou utiliser n'importe quelle chaîne arbitraire. Dans ce dernier cas, Chrome affiche l'interface utilisateur de l'erreur avec un message d'erreur générique et transmet le code au tiers assujetti à des restrictions.

Pour url, il identifie une page Web lisible avec des informations sur l'erreur afin de fournir des informations supplémentaires aux utilisateurs. Ce champ est utile aux utilisateurs, car les navigateurs ne peuvent pas fournir de messages d'erreur enrichis dans une interface utilisateur native. (par exemple, des liens vers les étapes suivantes, les coordonnées du service client, etc.). Si un utilisateur souhaite en savoir plus sur les détails de l'erreur et savoir comment la corriger, il peut consulter la page fournie à partir de l'UI du navigateur pour obtenir plus de détails. L'URL doit correspondre au même site que le fournisseur d'identité configURL.

try {
  const cred = await navigator.credentials.get({
    identity: {
      providers: [
        {
          configURL: 'https://idp.example/manifest.json',
          clientId: '1234',
        },
      ],
    }
  });
} catch (e) {
  const code = e.code;
  const url = e.url;
}

API Auto-Selected Flag

mediation: optional est le comportement par défaut de médiation des utilisateurs dans l'API Credential Management. Il déclenche la réauthentification automatique lorsque cela est possible. Toutefois, la réauthentification automatique peut être indisponible pour des raisons que seul le navigateur connaît. Lorsque cette fonctionnalité n'est pas disponible, l'utilisateur peut être invité à se connecter avec une médiation explicite de l'utilisateur, qui est un flux avec des propriétés différentes.

  • Du point de vue d'un appelant d'API, lorsqu'il reçoit un jeton d'ID, il n'a aucune visibilité sur le résultat d'un flux de réauthentification automatique. Il leur est donc difficile d'évaluer les performances des API et d'améliorer l'expérience utilisateur en conséquence.
  • Du point de vue du fournisseur d'identité, ils sont également incapables de déterminer si une réauthentification automatique s'est produite ou non pour l'évaluation des performances. En outre, le fait qu'une médiation utilisateur explicite ait été impliquée pourrait l'aider à prendre en charge davantage de fonctionnalités liées à la sécurité. Par exemple, certains utilisateurs peuvent préférer un niveau de sécurité plus élevé qui nécessite une médiation utilisateur explicite lors de l'authentification. Si un fournisseur d'identité reçoit une requête de jeton sans cette médiation, il peut la gérer différemment. Par exemple, renvoyez un code d'erreur permettant au tiers assujetti à des restrictions d'appeler à nouveau l'API FedCM avec mediation: required.

Par conséquent, une visibilité sur le flux de réauthentification automatique serait bénéfique pour les développeurs.

Avec l'API d'indicateur sélectionné automatiquement, Chrome indique si une autorisation utilisateur explicite a été obtenue en appuyant sur le bouton Continuer en tant que avec l'IdP et le RP, chaque fois qu'une réauthentification automatique se produit ou qu'une médiation explicite se produit. Le partage ne se produit qu'une fois l'autorisation de l'utilisateur accordée pour la communication IdP/RP.

Partage avec un IdP

Pour partager les informations avec l'autorisation d'intégration de l'IdP, Chrome inclut is_auto_selected=true dans la requête POST envoyée à id_assertion_endpoint:

POST /fedcm_assertion_endpoint HTTP/1.1
Host: idp.example
Origin: https://rp.example/
Content-Type: application/x-www-form-urlencoded
Cookie: 0x23223
Sec-Fetch-Dest: webidentity

account_id=123&client_id=client1234&nonce=Ct0D&disclosure_text_shown=true&is_auto_selected=true

Partage avec les tiers assujettis à des restrictions

Le navigateur peut partager les informations avec le tiers assujetti à des restrictions dans isAutoSelected via IdentityCredential:

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: 'https://idp.example/manifest.json',
      clientId: '1234'
    }]
  }
});

if (cred.isAutoSelected !== undefined) {
  const isAutoSelected = cred.isAutoSelected;
}

Interagir et partager des commentaires

Si vous avez des commentaires ou rencontrez des problèmes pendant les tests, vous pouvez les partager sur crbug.com.

Photo par Girl with red hat, publiée sur Unsplash