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.
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é.
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'APInavigator.login.setStatus("logged-in")
pour informer le navigateur que l'utilisateur s'est connecté. - Appelez
IdentityProvider.close()
pour fermer la boîte de dialogue.
Vous pouvez tester le comportement de l'API Login Status dans notre démonstration.
- Appuyez sur le bouton Go to the IdP and sign in (Accéder à l'IdP et se connecter).
- Se connecter avec un compte arbitraire
- Sélectionnez Session expirée dans le menu déroulant État du compte.
- Appuyez sur le bouton Mettre à jour les informations personnelles.
- 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é.
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:
code
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