简体   繁体   中英

React Context + Firebase Auth not populating onAuthStateChanged

I've been struggling with this for a while. My context provider below isn't triggering any onAuthStateChanged changes - ie it's not populating the user, even though they're logged in.

AuthProvider.js

import React, { createContext, useState, useEffect } from 'react';
import { firebaseAuth } from '../firebase/firebase';

export const AuthContext = createContext({ loggedIn: false });

const AuthProvider = props => {
  const [user, setUser] = useState({ loggedIn: false, email: null });

  useEffect(() => {
    const unsubscribe = firebaseAuth.onAuthStateChanged(user => {
      console.log(user); // Fires once "null"
      console.log(firebaseAuth.currentUser); // Fires once "null"
      if (user) {
        console.log('logged in');
        setUser({ loggedIn: true, email: user.email });
      } else {
        console.log('not logged in'); // Fires once
        setUser({ loggedIn: false });
      }
    });
    return () => {
      unsubscribe();
    }
  }, []);

  return (
    <AuthContext.Provider value={user}>
      {props.children}
    </AuthContext.Provider>
  );
};

export default AuthProvider;

firebase/firebase.js

import firebase from 'firebase/app';
import 'firebase/analytics';
import 'firebase/auth';
import 'firebase/firebase-firestore';

const firebaseConfig = {
  apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
  authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
  databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL,
  projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
  storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
  messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
  appId: process.env.REACT_APP_FIREBASE_APP_ID,
  measurementId: process.env.REACT_APP_FIREABSE_MEASUREMENT_ID
};

const firebaseApp = firebase.initializeApp(firebaseConfig);
firebase.analytics();
export const firebaseAuth = firebase.auth();

export default firebaseApp;

App.js

import React from 'react';
import AuthProvider from './providers/AuthProvider';
import Routes from './components/Routes';
import './App.scss';

const App = () => {
  return (
    <AuthProvider>
      <Routes />
    </AuthProvider>
  );
}

export default App;

As noted above, I get console output once from AuthProvider.js - null, null and "not logged in".

Can anyone point me in the right direction as to why it's not populating my user when logged in? Thanks!

The problem seemed to be in my UI Config. I had signInSuccessUrl: '/' . Once I removed that, it worked.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM