使用 expo go 保持 firebase 登录的最佳方法

Ber*_*tey 11 javascript firebase react-native firebase-authentication expo

我正在尝试使用Expo Go 在 React Native 中制作一个应用程序。已经成功让谷歌登录工作,一切都很好。不幸的是,用户的登录在应用程序重新启动之间不会保留。起初,我认为这是一个异步存储问题,但我可以在重新启动之间将项目保存在存储中。

我需要手动保存哪些数据才能在应用程序启动时让用户重新登录?

我更喜欢手动保存数据,因为所有应该有效的方法都不适合我。我尝试过的方法:

  • 打电话setPersistence(getAuth(), browserLocalPersistence)给我一个错误,请参阅这篇文章以了解我收到的确切错误。
  • 使用onAuthStateChanged对我来说也不起作用,事实上,这是我知道何时登录的主要方式。用户对象始终为空,并且永远不会从空更改,直到用户再次登录(每次应用程序启动时都会发生这种情况) 。
    useEffect(() => getAuth().onAuthStateChanged(value => {
      if (value) {
        console.log("User is signed in");
      }  else {
        console.log("User is signed out");
        // navigation.navigate("login")
      }
    }), [])
    
    Run Code Online (Sandbox Code Playgroud)

(此代码将始终在应用程序重新启动时打印用户已注销。)
此时,我认为如果我可以自己保存用户的凭据,然后在应用程序启动时以静默方式登录它们,那就会更容易。我很难找到执行此操作的代码。

Ber*_*tey 36

好的,所以我意识到,为了保留登录状态,如果使用 expo,您实际上必须执行一个特殊的过程。您需要初始化自己的身份验证,传入异步存储,如下所示

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)
});
Run Code Online (Sandbox Code Playgroud)

  • 安全吗?我认为 AsyncStorage 不会加密数据 (3认同)

小智 11

@Bernard Allotey 的答案是正确的。这是 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;
Run Code Online (Sandbox Code Playgroud)


小智 6

@Bernard Allotey 的回答对我有用。然而,我更换了

export const auth = getAuth(app)
Run Code Online (Sandbox Code Playgroud)

export const auth = initializeAuth(app, { persistence: getReactNativePersistence(AsyncStorage) });
Run Code Online (Sandbox Code Playgroud)

这避免了错误FirebaseError: Firebase: Error (auth/already-initialized).