首页 > 解决方案 > 几个小时后,Expo 上的 Firebase 身份验证到期

问题描述

我有一个 Expo 应用程序,用于AppAuth向 Google 进行身份验证。用户通过 Google 身份验证后,我使用 Google ID 令牌构建 Firebase 凭据并使用 Firebase 登录。

身份验证和对 Firebase 的读取运行良好,在用户回来几个小时后,用户不再通过 Firebase 进行身份验证。

PS:刷新或关闭应用程序使用户保持身份验证,这似乎是一个及时的事情。

根据文档,默认情况下应该启用持久性,但我也尝试通过使用强制它,但.setPersistence(firebase.auth.Auth.Persistence.LOCAL)没有成功。

这是我的代码:

  onSignIn = googleUser => {
    // We need to register an Observer on Firebase Auth to make sure auth is initialized.
    var unsubscribe = firebase.auth().onAuthStateChanged(
      function(firebaseUser) {
        unsubscribe();

        firebase
          .auth()
          .setPersistence(firebase.auth.Auth.Persistence.LOCAL)
          .then(() => {
            // Check if we are already signed-in Firebase with the correct user.
            if (!this.isUserEqual(googleUser, firebaseUser)) {
              // Build Firebase credential with the Google ID token.
              var credential = firebase.auth.GoogleAuthProvider.credential(
                googleUser.idToken,
                googleUser.accessToken
              );
              // Sign in with credential from the Google user.
              firebase
                .auth()
                .signInWithCredential(credential)
                .then(function(result) {
                  if (result.additionalUserInfo.isNewUser) {
                    firebase
                      .firestore()
                      .collection("users")
                      .doc(result.user.email)
                      .set({
                        email: result.user.email,
                        profile_picture:
                          result.additionalUserInfo.profile.picture,
                        first_name:
                          result.additionalUserInfo.profile.given_name,
                        last_name:
                          result.additionalUserInfo.profile.family_name,
                        full_name: result.additionalUserInfo.profile.name,
                        locale: result.additionalUserInfo.profile.locale,
                        provider_id: result.additionalUserInfo.providerId,
                        created_at: Date.now()
                      })
                      .then(function(snapshot) {});
                  } else {
                    firebase
                      .firestore()
                      .collection("users")
                      .doc(result.user.email)
                      .update({
                        last_logged_in: Date.now()
                      });
                  }
                })
                .catch(function(error) {
                  console.log(error);
                  // Handle Errors here.
                  var errorCode = error.code;
                  var errorMessage = error.message;
                  // The email of the user's account used.
                  var email = error.email;
                  // The firebase.auth.AuthCredential type that was used.
                  var credential = error.credential;
                });
          } else {
              console.log("User already signed-in Firebase.");
            }
          });
      }.bind(this)
    );
  };

signInAsync = async () => {
    const authState = await AppAuth.authAsync(config);
    await this.cacheAuthAsync(authState);
    this.onSignIn(authState);
    return authState;
  };

我希望会话和身份验证能够打开并自动刷新。

标签: javascriptfirebasereact-nativefirebase-authenticationexpo

解决方案


编辑

据此:When to set Firebase auth state persistence,没关系

原始答案

我想你可能必须setPersistence以前onAuthStateChanged

onSignIn = googleUser => {
  return firebase.auth().setPersistence()
      .then(() => {
          return new Promise((resolve, reject) => {
              const unsubscribe = firebase.auth().onAuthStateChange((result) => {
                   resolve(result)
          })
      })
      .then( /// etc
}

推荐阅读