135 votes

Comment détecter si un utilisateur est déjà connecté à Firebase ?

J'utilise l'api firebase node dans mes fichiers javascript pour la connexion Google.

firebase.initializeApp(config);
let provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider);

Cela fonctionne bien et l'utilisateur peut se connecter avec ses informations d'identification Google. Lorsque l'utilisateur visite à nouveau la page, la fenêtre contextuelle s'ouvre à nouveau, mais comme il s'est déjà connecté, la fenêtre contextuelle se ferme sans nécessiter d'interaction de la part de l'utilisateur. Existe-t-il un moyen de vérifier si un utilisateur s'est déjà connecté avant d'afficher la fenêtre contextuelle ?

167voto

bojeil Points 11569

https://firebase.google.com/docs/auth/web/manage-users

Vous devez ajouter un observateur de changement d'état d'authentification.

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

8 votes

C'est incohérent pour moi. stackoverflow.com/questions/39395158/

3 votes

En utilisant le onAuthStateChanged, y a-t-il un moyen de savoir si un utilisateur est nouveau ?

1 votes

Oui, mais pas à travers onAuthStateChanged . Cela a été ajouté dans la version 4.6.0 : firebase.google.com/support/release-notes/js#4.6.0 Vous pouvez l'obtenir à partir de la méthode de connexion ou à partir de currentUser.metadata (dernier signe dans le temps et temps de la création)...

102voto

Passos Points 380

Vous pouvez également vérifier s'il existe un currentUser

var user = firebase.auth().currentUser;

if (user) {
  // User is signed in.
} else {
  // No user is signed in.
}

15 votes

Le résultat est nul, même après une connexion immédiate.

11 votes

C'est étrange, cela fonctionne pour moi, peut-être le problème est-il dû au fait que l'authentification est asynchrone et que _ currentUser_ n'a pas encore été mis à jour.

1 votes

D'après la documentation : currentUser peut aussi être nul parce que l'objet auth n'a pas fini de s'initialiser. Si vous utilisez un observateur pour suivre l'état de la connexion de l'utilisateur, vous n'avez pas besoin de gérer ce cas.

42voto

Qwerty Points 1165

Il est pas possible pour savoir si un utilisateur sera être signé lorsqu'une page commence à se charger, il existe cependant une solution de contournement.

Vous pouvez mémoriser le dernier état d'authentification à localStorage pour le faire persister entre les sessions et entre les onglets.

Ensuite, lorsque la page commence à se charger, vous pouvez supposer de manière optimiste que l'utilisateur sera automatiquement réinscrit et reporter la boîte de dialogue jusqu'à ce que vous en soyez certain (c'est-à-dire après onAuthStateChanged feux). Sinon, si le localStorage est vide, vous pouvez afficher la boîte de dialogue immédiatement.

La base de feu onAuthStateChanged se déclenchera grossièrement 2 secondes après le chargement d'une page.

// User signed out in previous session, show dialog immediately because there will be no auto-login
if (!localStorage.getItem('myPage.expectSignIn')) showDialog() // or redirect to sign-in page

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    // User just signed in, we should not display dialog next time because of firebase auto-login
    localStorage.setItem('myPage.expectSignIn', '1')
  } else {
    // User just signed-out or auto-login failed, we will show sign-in form immediately the next time he loads the page
    localStorage.removeItem('myPage.expectSignIn')

    // Here implement logic to trigger the login dialog or redirect to sign-in page, if necessary. Don't redirect if dialog is already visible.
    // e.g. showDialog()
  }
})

Je l'utilise avec React y react-router . J'ai mis le code ci-dessus dans componentDidMount de mon composant App Root. Là, dans le rendu, j'ai quelques PrivateRoutes

<Router>
  <Switch>
    <PrivateRoute
      exact path={routes.DASHBOARD}
      component={pages.Dashboard}
    />
...

Et voici comment mon PrivateRoute est implémenté :

export default function PrivateRoute(props) {
  return firebase.auth().currentUser != null
    ? <Route {...props}/>
    : localStorage.getItem('myPage.expectSignIn')
      // if user is expected to sign in automatically, display Spinner, otherwise redirect to login page.
      ? <Spinner centered size={400}/>
      : (
        <>
          Redirecting to sign in page.
          { location.replace(`/login?from=${props.path}`) }
        </>
      )
}

    // Using router Redirect instead of location.replace
    // <Redirect
    //   from={props.path}
    //   to={{pathname: routes.SIGN_IN, state: {from: props.path}}}
    // />

0 votes

Vous pensez pouvoir m'aider ? J'ai essayé la redirection d'auto-login que vous avez en haut de votre réponse, et maintenant je n'arrive pas à la supprimer. J'ai entièrement vidé mon stockage local et je ne peux toujours pas accéder à mon site firebase en étant déconnecté à cause des redirections constantes.

0 votes

@hego64 Vous êtes-vous déconnecté de votre application firebase ? Cette solution ne permet pas de se connecter. Il permet seulement de sauter le formulaire de connexion si l'utilisateur ne s'est pas déconnecté lors de la session précédente. / EDIT : Êtes-vous dans une boucle de redirection ? Je vais mettre à jour la réponse.

0 votes

Oui, j'aurais dû être plus clair, j'étais coincé dans une boucle de redirection. Je me déconnectais, et au lieu de revenir à l'application, j'étais ramené directement à la page de connexion. J'ai pu résoudre le problème en revenant à un déploiement antérieur, mais à part cela, je ne savais pas trop quoi faire pour résoudre le problème.

26voto

Daniel Vukasovich Points 1104

Il n'est pas nécessaire d'utiliser la fonction onAuthStateChanged() dans ce scénario.

Vous pouvez facilement détecter si l'utilisateur est connecté ou non en exécutant :

var user = firebase.auth().currentUser;

Pour ceux qui rencontrent le problème du "returning null", c'est simplement parce que vous n'attendez pas que l'appel à Firebase soit terminé.

Supposons que vous exécutez l'action de connexion sur la page A et que vous invoquez ensuite la page B. Sur la page B, vous pouvez appeler le code JS suivant pour tester le comportement attendu :

  var config = {
    apiKey: "....",
    authDomain: "...",
    databaseURL: "...",
    projectId: "..",
    storageBucket: "..",
    messagingSenderId: ".."
  };
  firebase.initializeApp(config);

    $( document ).ready(function() {
        console.log( "testing.." );
        var user = firebase.auth().currentUser;
        console.log(user);
    });

Si l'utilisateur est connecté, alors "var user" contiendra la charge utile JSON attendue, sinon, ce sera juste "null".

Et c'est tout ce dont vous avez besoin.

Salutations

3 votes

@Mauricio Silvestre c'est ça ? Utilisation de firebase.auth.currentUser retourne indéfini si je suis connecté ou non. Seul auth() renvoie le résultat correct lorsque je suis connecté.

1voto

muetzerich Points 3855

Utiliser Firebase.getAuth() . Il retourne l'état actuel du client Firebase. Sinon, la valeur de retour est null Voici les documents : https://www.firebase.com/docs/web/api/firebase/getauth.html

22 votes

Déprécié, à éviter firebase.getAuth()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X