如何在React Native中使用Web SDK刷新登录?

时间:2018-09-08 08:25:39

标签: firebase react-native firebase-realtime-database firebase-authentication google-cloud-functions

我在ReactNative应用程序中使用Firebase Web sdk(JS)。我的登录很简单:

firebase.auth().signInWithEmailAndPassword(email, password)

它工作正常。但是,如果用户在后台运行我的应用程序并在数小时后返回,则他们将被注销(没有明确注销,并且没有我的应用程序注销)。登录令牌似乎有1个小时的超时,但是当应用程序后台运行或回到前台时,Firebase不会刷新此令牌。

这对我的用户来说是一种糟糕的体验,因为他们第二天回来时被迫再次登录。

即使应用程序为后台或回到前台,如何强制Firebase SDK刷新登录令牌?

或者几个小时后应用重新回到前台时,我可以自己刷新吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

身份验证状态会在应用程序重新启动后自动保留。但由于ID令牌每小时都会过期,因此必须将其加载并针对服务器进行验证

我最初的猜测是用户状态根本还没有恢复,您可以使用自动状态侦听器解决。

firebase.auth().onAuthStateChanged(function (user) {
  if (user) {
    ... user is signed in
  }
  else {
    ... user is NOT signed in, show login screen
  }
})

也请在此博客文章中查看此checking the current authentication state,其中提供了如何在React Native代码中使用上述方法的示例。

答案 1 :(得分:0)

这完全是我的错。我的App.js渲染方法中有一行,例如:

// Should have been wrapped in an if
store.dispatch(FirebaseAuth.signOutCurrentUser());

// XXX TODO login as known user for testing, DO NOT USE IN PRODUCTION
const autoLogoutAndLoginAsTestAccount = false;
if (__DEV__ && autoLogoutAndLoginAsTestAccount) {
  store.dispatch(FirebaseAuth.signInWithEmailAndPassword({ email: "joel@test.com", password: "REDACTED" }));
}

应该是

// XXX TODO login as known user for testing, DO NOT USE IN PRODUCTION
const autoLogoutAndLoginAsTestAccount = false;
if (__DEV__ && autoLogoutAndLoginAsTestAccount) {
  store.dispatch(FirebaseAuth.signOutCurrentUser());
  store.dispatch(FirebaseAuth.signInWithEmailAndPassword({ email: "joel@test.com", password: "REDACTED" }));
}

我已经准备好了这个,所以每次热重载RN代码时都不需要登录,但是尽管我将autologin包裹在if中以防止它在prod / testflight中运行,但我没有包装autologout 。因此,Firebase会按照我的要求进行操作,并在每次重新呈现应用程序时(例如在重新启动时)注销用户。

我正在使用身份验证侦听器,这不是问题。

对不起,这对我来说是一个愚蠢的错误,我感到很尴尬,因为我通常对自己的代码非常谨慎,而我只是错过了这一点。我并不是要浪费任何人的时间,并感谢大家的仔细回答。我将其发布在这里,以防将来对某人有所帮助。