Ce document décrit les meilleures pratiques pour utiliser les connexions de redirection sur les navigateurs qui bloquent les cookies tiers. Vous devez suivre l'une des options répertoriées ici pour que signInWithRedirect()
fonctionne comme prévu dans les environnements de production, sur tous les navigateurs.
Aperçu
Pour rendre le flux signInWithRedirect()
transparent pour vous et vos utilisateurs, le SDK JavaScript Firebase Authentication utilise un iframe cross-origin qui se connecte au domaine Firebase Hosting de votre application. Cependant, ce mécanisme ne fonctionne pas avec les navigateurs qui bloquent l'accès au stockage tiers.
Étant donné que demander à vos utilisateurs de désactiver les fonctionnalités de partitionnement du stockage sur le navigateur est rarement une option, 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
, vous n'êtes pas concerné par ce problème et aucune action n'est nécessaire. - 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 : mettez à 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 utiliser votre domaine personnalisé en tant que authDomain
. Cela garantit que 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.)
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 utiliser 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 manière dont vous procéderez dépendra 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 pour autoriser ressemble àhttps://<the-domain-that-serves-your-app>/__/auth/handler
— la fin/__/auth/handler
est importante.De même, si vous utilisez un fournisseur SAML, ajoutez le nouveau
authDomain
à l'URL SAML Assertion Consumer Service (ACS).
Option 2 : Basculer vers 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.
API Web modulaire
// Before
// ==============
signInWithRedirect(auth, new GoogleAuthProvider());
// After the page redirects back
const userCred = await getRedirectResult(auth);
// After
// ==============
const userCred = await signInWithPopup(auth, new GoogleAuthProvider());
API d'espace de noms Web
// 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 contextuelle n'est pas toujours idéale pour les utilisateurs : les fenêtres contextuelles 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 popups est un problème pour votre application, vous devrez suivre l'une des autres options.
Option 3 : Demandes d'authentification proxy à firebaseapp.com
Le flux signInWithRedirect
commence par rediriger depuis votre domaine d'application vers le domaine spécifié dans le paramètre authDomain
dans la configuration firebase ("authDomain
héberge le code d'aide à la connexion qui redirige vers le fournisseur d'identité, qui, en cas de succès, redirige vers le domaine de l'application.
Lorsque le flux d'authentification revient à votre domaine d'application, le stockage du 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 cross-origin, qui serait autrement bloqué par les navigateurs.
Configurez un proxy inverse sur votre serveur d'applications afin que les requêtes GET/POST adressées à
https://<app domain>/__/auth/
soient transmises àhttps://<project>.firebaseapp.com/__/auth/
. Assurez-vous que cette redirection est transparente pour le navigateur ; cela ne peut pas être fait via une redirection 302.Si vous utilisez nginx pour servir votre domaine personnalisé, la configuration du proxy inverse ressemblera à ceci :
# 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
redirect_uri
autorisé, l'URL ACS et votreauthDomain
. Une fois que vous avez redéployé votre application, l'accès au stockage cross-origin ne devrait plus se produire.
Option 4 : hébergez vous-même le code d'aide à la connexion dans votre domaine
Une autre façon d'éliminer l'accès au stockage cross-origin consiste à auto-héberger le code d'aide à la connexion Firebase. Cependant, cette approche ne fonctionne pas pour la connexion Apple ou SAML. Utilisez cette option uniquement si la configuration du proxy inverse de l'option 3 est impossible.
L'hébergement du code d'assistance comporte les étapes suivantes :
Téléchargez les fichiers à héberger à partir de l'emplacement
<project>.firebaseapp.com
en 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
Hé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>
.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 bogues et fonctionnalités sont prises en compte.
Suivez les étapes de l'option 1 pour mettre à jour
redirect_uri
autorisé et votreauthDomain
. Une fois que vous avez redéployé votre application, l'accès au stockage cross-origin ne devrait plus se produire.
Option 5 : gérer la connexion du fournisseur de manière indépendante
Le SDK Firebase Authentication fournit signInWithPopup()
et signInWithRedirect()
comme méthodes pratiques pour encapsuler une logique compliquée et éviter d'avoir à impliquer un autre SDK. Vous pouvez éviter d'utiliser entièrement l'une ou l'autre méthode en vous connectant indépendamment à votre fournisseur, puis en utilisant signInWithCredential()
pour échanger les informations d'identification du fournisseur contre des informations d'identification Firebase Authentication. Par exemple, vous pouvez utiliser le SDK Google Sign In , un exemple de code pour obtenir un identifiant de compte Google, puis instancier un nouvel identifiant Google, en exécutant le code suivant :
API Web modulaire
// `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);
API d'espace de noms Web
// `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);
Après avoir appelé signInWithCredential()
, le reste de votre application fonctionne comme avant.
Les instructions pour obtenir un identifiant Apple sont ici .