Estoy tratando de hacer una aplicación en React Native usando Expo Go. He logrado que Google inicie sesión y todo está bien. Desafortunadamente, el inicio de sesión del usuario NO persiste entre los reinicios de la aplicación. Al principio, pensé que era un problema de almacenamiento asíncrono, pero puedo guardar elementos en el almacenamiento sin problemas entre relanzamientos.
¿Qué datos necesitaría guardar manualmente para poder volver a iniciar la sesión del usuario cada vez que se inicie la aplicación?
Preferiría conservar los datos manualmente, ya que todos los métodos que se supone que funcionan, no funcionan para mí. Métodos que he probado:
setPersistence(getAuth(), browserLocalPersistence)
me da un error, vea esta publicación para ver el error exacto que estoy recibiendo.onAuthStateChanged
tampoco funciona para mí, de hecho, esa es la principal forma en que sé cuándo iniciar sesión. El objeto de usuario siempre es nulo, y nunca cambia de nulo hasta que el usuario inicia sesión nuevamente (lo que sucede en cada inicio de aplicación ). useEffect(() => getAuth().onAuthStateChanged(value => { if (value) { console.log("User is signed in"); } else { console.log("User is signed out"); // navigation.navigate("login") } }), [])
(Este código siempre imprimirá que el usuario ha cerrado la sesión en el reinicio de la aplicación).
En este punto, creo que sería más fácil si pudiera guardar las credenciales del usuario yo mismo y luego iniciar sesión en silencio al iniciar la aplicación. Estoy teniendo dificultades para encontrar el código para hacer esto.
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í
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) });
Debe usar SecureStore
para almacenar los datos en el dispositivo. Algo así como LocalStorage
en la web, SharedPreference
en Android y NSUserDefaults
en iOS.
Ejemplo:
// save your thing async function save(key, value) { await SecureStore.setItemAsync(key, value); } // get your thing async function getValueFor(key) { let result = await SecureStore.getItemAsync(key); if (result) { alert("🔐 Here's your value 🔐 \n" + result); } else { alert('No values stored under that key.'); } }
Lea más aquí: https://docs.expo.dev/versions/latest/sdk/securestore/
la idea es guardar el JWT de Firebase en SecureStore, de modo que cuando se inicie la aplicación, verifique este valor, luego use ese JWT en la tienda segura cuando llame a su API
La respuesta de @Bernard Allotey es correcta. Aquí hay un ejemplo con la versión compatible de firebase 9
import firebase from 'firebase/compat/app'; import 'firebase/compat/auth'; import 'firebase/compat/firestore'; import 'firebase/compat/functions'; import AsyncStorage from '@react-native-async-storage/async-storage'; import {initializeAuth} from 'firebase/auth'; import {getReactNativePersistence} from 'firebase/auth/react-native'; import firebaseConfig from './firebaseConfig'; const fireApp = firebase.initializeApp(firebaseConfig); firebase.firestore(); firebase.functions(); // firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL); initializeAuth(fireApp, { persistence: getReactNativePersistence(AsyncStorage), }); export default firebase;