javascript - 几个小时后,Expo 上的 Firebase 身份验证到期

标签 javascript firebase react-native firebase-authentication expo

我有一个 Expo 应用程序,使用 AppAuth与谷歌进行身份验证。
用户通过 Google 身份验证后,我使用 Google ID token 构建 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;
  };

我期待 session 和身份验证打开并自动刷新。

最佳答案

编辑

据此: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
}

关于javascript - 几个小时后,Expo 上的 Firebase 身份验证到期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799510/

相关文章:

javascript - 在 React Native 中如何获取带认证的网络图片?

javascript - 单击 Accordion 标题时 JQuery Accordion 内容的偏移

javascript - jQuery(form).serialize() 失败,返回 "URIError: malformed URI sequence"

android - 我的程序无法从 Firebase 中的 addChildEventListener 获得结果

firebase - Flutter & Firestore - 更新永不停止(从一个值切换到另一个值)

ios - react native iOS 文本输入 : switching secureTextEntry switches font

javascript - 如何包含外部 HTML-Head?

javascript - Backbone : Why assign `$(' #footer' )` to ` el`?

javascript - 如何使用 google-cloud 和 node js 从 firebase 存储中检索图像并将其显示在网页上

react-native - 网络上的导航 react-navigation