Bonnes pratiques d'utilisation de signInWithRedirect sur les navigateurs qui bloquent l'accès au stockage tiers
Ce document décrit les bonnes pratiques d'utilisation des connexions par redirection sur les navigateurs qui bloquent les cookies tiers. Vous devez suivre l'une des options listées ici pour que signInWithRedirect() fonctionne comme prévu dans les environnements de production, sur tous les navigateurs.
Présentation
Pour que le
signInWithRedirect() flux
soit fluide pour vous et vos utilisateurs, le SDK JavaScript Firebase Authentication utilise un
iframe inter-origine qui se connecte au domaine Firebase Hosting de votre application.
Toutefois, ce mécanisme ne fonctionne pas avec les navigateurs qui bloquent l'accès au stockage tiers.
Comme il est rarement possible de demander à vos utilisateurs de désactiver les fonctionnalités de partitionnement du stockage sur le navigateur, vous devez plutôt appliquer l'une des options de configuration suivantes à votre application, en fonction des spécificités de votre cas d'utilisation.
- Si vous hébergez votre application avec Firebase Hosting sur un sous-domaine de
firebaseapp.com, ce problème ne vous concerne pas et aucune action n'est requise. - Si vous hébergez votre application avec Firebase Hosting sur un domaine personnalisé ou un sous-domaine de
web.app, utilisez l'option 1. - Si vous hébergez votre application avec un service autre que Firebase, utilisez l'option 2, l'option 3, l'option 4, ou l'option 5.
Option 1 : Mettre à jour votre configuration Firebase pour utiliser votre domaine personnalisé comme authDomain
Si vous hébergez votre application avec Firebase Hosting à l'aide d'un domaine personnalisé, vous pouvez configurer le SDK Firebase pour qu'il utilise votre domaine personnalisé comme authDomain. Ainsi, votre application et l'iframe d'authentification utilisent le même domaine, ce qui évite le problème de connexion. (Si vous n'utilisez pas Firebase Hosting, vous devez utiliser une autre option.) Assurez-vous d'avoir configuré le domaine personnalisé sur le même projet que celui que vous utilisez pour l'authentification.
Pour mettre à jour votre configuration Firebase afin d'utiliser votre domaine personnalisé comme domaine d'authentification, procédez comme suit :
Configurez le SDK Firebase JS pour qu'il utilise votre domaine personnalisé comme
authDomain:const firebaseConfig = { apiKey: "<api-key>", authDomain: "<the-domain-that-serves-your-app>", databaseURL: "<database-url>", projectId: "<project-id>", appId: "<app-id>" };
Ajoutez le nouveau
authDomainà la liste des URI de redirection autorisés de votre fournisseur OAuth. La procédure à suivre dépend du fournisseur, mais en général vous pouvez suivre la section "Avant de commencer" de n'importe quel fournisseur pour obtenir des instructions précises (par exemple, le fournisseur Facebook). L'URI mis à jour à autoriser se présente comme suit :https://<the-domain-that-serves-your-app>/__/auth/handler. La partie/__/auth/handlerà la fin est importante.De même, si vous utilisez un fournisseur SAML, ajoutez le nouveau
authDomainà l'URL du service ACS (Assertion Consumer Service) SAML.Assurez-vous que votre
continue_urifigure dans la liste des domaines autorisés.Si nécessaire, redéployez avec Firebase Hosting pour récupérer le fichier de configuration Firebase le plus récent hébergé sur
/__/firebase/init.json.
Option 2 : Passer à signInWithPopup()
Utilisez signInWithPopup() au lieu de
signInWithRedirect(). Le reste du code de votre application reste le même, mais l'objet UserCredential est récupéré différemment.
Version Web 9
// Before
// ==============
signInWithRedirect(auth, new GoogleAuthProvider());
// After the page redirects back
const userCred = await getRedirectResult(auth);
// After
// ==============
const userCred = await signInWithPopup(auth, new GoogleAuthProvider());
Version Web 8
// Before
// ==============
firebase.auth().signInWithRedirect(new firebase.auth.GoogleAuthProvider());
// After the page redirects back
var userCred = await firebase.auth().getRedirectResult();
// After
// ==============
var userCred = await firebase.auth().signInWithPopup(
new firebase.auth.GoogleAuthProvider());
```
La connexion via une fenêtre pop-up n'est pas toujours idéale pour les utilisateurs : les fenêtres pop-up sont parfois bloquées par l'appareil ou la plate-forme, et le flux est moins fluide pour les utilisateurs mobiles. Si l'utilisation de fenêtres pop-up pose problème pour votre application, vous devrez suivre l'une des autres options.
Option 3 : Proxy des requêtes d'authentification vers firebaseapp.com
Le flux signInWithRedirect commence par une redirection du domaine de votre application vers le
domaine spécifié dans le authDomain paramètre de la configuration Firebase
("authDomain héberge le code d'assistance à la connexion qui redirige vers le fournisseur d'identité, lequel, en cas de succès, redirige vers le domaine de l'application.
Lorsque le flux d'authentification revient au domaine de votre application, le stockage sur le navigateur du domaine d'assistance à la connexion est accessible. Cette option et la suivante (pour auto-héberger le code) éliminent l'accès au stockage inter-origine, qui est sinon bloqué par les navigateurs.
Configurez un proxy inverse sur le serveur de votre application afin que les requêtes GET/POST vers
https://<app domain>/__/auth/soient transmises àhttps://<project>.firebaseapp.com/__/auth/. Assurez-vous que cette transmission est transparente pour le navigateur. Elle ne peut pas être effectuée via une redirection 302.Si vous utilisez nginx pour diffuser votre domaine personnalisé, la configuration du proxy inverse se présente comme suit :
# reverse proxy for signin-helpers for popup/redirect sign in. location /__/auth { proxy_pass https://<project>.firebaseapp.com; }Suivez les étapes de l'option 1 pour mettre à jour l'élément
redirect_uriautorisé, l'URL ACS et votreauthDomain. Une fois que vous aurez redéployé votre application, l'accès au stockage inter-origine ne devrait plus se produire.
Option 4 : Auto-héberger le code d'assistance à la connexion dans votre domaine
Une autre façon d'éliminer l'accès au stockage inter-origine consiste à auto-héberger le code d'assistance à la connexion Firebase. Toutefois, cette approche ne fonctionne pas pour la connexion Apple ni pour SAML. N'utilisez cette option que si la configuration du proxy inverse de l'option 3 n'est pas réalisable.
L'hébergement du code d'assistance comporte les étapes suivantes :
Téléchargez les fichiers à héberger à partir de l'emplacement
<project>.firebaseapp.comen exécutant les commandes suivantes :mkdir signin_helpers/ && cd signin_helpers wget https://<project>.firebaseapp.com/__/auth/handler wget https://<project>.firebaseapp.com/__/auth/handler.js wget https://<project>.firebaseapp.com/__/auth/experiments.js wget https://<project>.firebaseapp.com/__/auth/iframe wget https://<project>.firebaseapp.com/__/auth/iframe.js wget https://<project>.firebaseapp.com/__/auth/links wget https://<project>.firebaseapp.com/__/auth/links.js wget https://<project>.firebaseapp.com/__/firebase/init.jsonHébergez les fichiers ci-dessus sous le domaine de votre application. Assurez-vous que votre serveur Web peut répondre à
https://<app domain>/__/auth/<filename>ethttps://<app domain>/__/firebase/init.json.Voici un exemple d'implémentation de serveur qui télécharge et héberge les fichiers. Nous vous recommandons de télécharger et de synchroniser les fichiers régulièrement pour vous assurer que les dernières corrections de bugs et fonctionnalités sont prises en compte.
Suivez les étapes de l'option 1 pour mettre à jour l'élément autorisé
redirect_uriet votreauthDomain. Une fois que vous aurez redéployé votre application, l'accès au stockage inter-origine ne devrait plus se produire.
Option 5 : Gérer la connexion du fournisseur indépendamment
Le SDK Firebase Authentication fournit
signInWithPopup() et
signInWithRedirect() comme
méthodes pratiques pour encapsuler une logique complexe et éviter d'avoir à impliquer
un autre SDK. Vous pouvez éviter d'utiliser l'une ou l'autre de ces méthodes en vous connectant indépendamment à votre fournisseur, puis en utilisant
signInWithCredential() pour
échanger les identifiants du fournisseur contre des identifiants Firebase Authentication.
Par exemple, vous pouvez utiliser le
SDK Google Sign In,
un exemple de code
pour obtenir des identifiants de compte Google, puis instancier de nouveaux identifiants Google
en exécutant le code suivant :
Version Web 9
// `googleUser` from the onsuccess Google Sign In callback.
// googUser = gapi.auth2.getAuthInstance().currentUser.get();
const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token);
const result = await signInWithCredential(auth, credential);
Version Web 8
// `googleUser` from the onsuccess Google Sign In callback.
const credential = firebase.auth.GoogleAuthProvider.credential(
googleUser.getAuthResponse().id_token);
const result = await firebase.auth().signInWithCredential(credential);
Une fois que vous avez appelé signInWithCredential(), le reste de votre application fonctionne comme avant.
Vous trouverez ici des instructions pour obtenir des identifiants Apple.