Es la primera vez que uso firebase y estoy tratando de configurar la persistencia pero obtengo un error. Estoy usando expo en reaccionar nativo . Aquí está mi código:
import firebase from "firebase/compat/app"; import "firebase/compat/auth"; import "firebase/compat/firestore"; const confirmCode = async () => { const credential = firebase.auth.PhoneAuthProvider.credential( verificationId, code ); firebase .auth() .setPersistence(firebase.auth.Auth.Persistence.LOCAL) .then(async () => { return firebase .auth() .signInWithCredential(credential) .then((result) => { setIsNew(result.additionalUserInfo.isNewUser); result.user.getIdToken().then((token) => setUserToken(token)); }); }) .catch((error) => { console.log(error.message); }); };Recibo el error undefined no es un objeto (evaluando 'this.storage.setItem') cuando se trata de persistir.
Estoy usando esta página en Google Docs y la versión más reciente de Firebase 9.6.8. Funciona bien sin persistencia, pero el usuario debe iniciar sesión cada vez que abre una aplicación.
He buscado en docenas de subprocesos en stackoverflow y github pero no he encontrado ninguna respuesta para ese problema.
Y tampoco muestra que ningún usuario haya iniciado sesión con o sin persistencia:
if (firebase.auth().currentUser !== null) { console.log(firebase.auth().currentUser.uid); } else { console.log("no users logged"); }Pensé en usar de alguna manera el almacenamiento asíncrono, pero realmente no sé cómo podría hacerlo funcionar.
Ok, entonces me di cuenta de que para preservar el estado de inicio de sesión, en realidad tienes que hacer un proceso especial si usas expo. Debe inicializar su propia autenticación, pasando Async Storage, así. Al hacerlo de esta manera, no hay necesidad de configurar la persistencia.
import { initializeApp } from "firebase/app" import { initializeAuth } from "firebase/auth" import { getReactNativePersistence } from "firebase/auth/react-native" import AsyncStorage from "@react-native-async-storage/async-storage" const defaultApp = initializeApp(config); initializeAuth(defaultApp, { persistence: getReactNativePersistence(AsyncStorage) });Si alguien tiene el mismo problema, logré resolverlo con la ayuda de Bernard Allotey. Así es como lo hice:
En aplicación.js:
import { initializeApp } from "firebase/app"; import { initializeAuth } from "firebase/auth"; import { getReactNativePersistence } from "firebase/auth/react-native"; import AsyncStorage from "@react-native-async-storage/async-storage"; import firebaseConfig from "./firebaseConfing"; useEffect(async () => { const defaultApp = initializeApp(firebaseConfig); initializeAuth(defaultApp, { persistence: getReactNativePersistence(AsyncStorage), }); }, []);En mi primera pantalla:
import { getAuth, onAuthStateChanged } from "firebase/auth"; onAuthStateChanged(getAuth(), (user) => { if (user) { console.log(user); } else { console.log("signed out"); } });Y para iniciar sesión estoy usando esto:
import { getAuth, signInWithPhoneNumber } from "firebase/auth"; async function sendVerification() { const auth = getAuth(); signInWithPhoneNumber( auth, countryCode + phoneNumber, recaptchaVerifier.current ).then((confirmationResult) => navigation.navigate("SmsCode", { confirmationResult: confirmationResult, phoneNumber: phoneNumber, }) ); } // next screen const confirmCode = async () => { confirmationResult.confirm(code).then((result) => { result.user.getIdToken().then(async (token) => { setUserToken(token); }); }); };Ahora el usuario persiste como yo quería. Muchas gracias por la ayuda.