React-native - Firebase onAuthStateChanged无法正常工作

时间:2017-11-07 03:05:10

标签: javascript reactjs firebase react-native firebase-authentication

我无法在我的react-native应用程序中持久保存firebase会话。这个问题几乎完全相同 React Native - Firebase auth persistence not working 但答案提供给我没有用。

目前我登录如下:

export const loginUser = ({ email, password }) => {
  return (dispatch) => {
    dispatch({ type: LOGIN_USER });

    firebase.auth().signInWithEmailAndPassword(email, password)
      .then(user => loginUserSuccess(dispatch, user))
      .catch(() => loginUserFailed(dispatch))

  };
};

我的会话已创建,我可以访问存储在firebase上的用户对象。

当我使用Cmd + R或关闭应用程序并重新打开它时,我的会话就消失了。我在app.js文件的componentWillMount()部分运行了以下内容:

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    console.log('user is logged');
  } else {
    console.log('not logged in')
  }
});

每当我刷新应用程序或完全关闭它并重新打开时,我都会收到“未登录”的响应。

我也尝试过查询:

firebase.auth().currentUser

但是在返回null

时遇到同样的问题

我做错了什么?

是否有一种特殊的方法可以保持会话处于活动状态而我不在用?

2 个答案:

答案 0 :(得分:2)

我发布这个问题已经有一段时间,但我想我会发布我的解决方案。

事实证明我的初始设置(有点)有效。我的意思是onAuthStateChanged花了一些时间来回听firebase,并且在此期间加载的其他应用程序认为用户没有登录,因为这是默认状态。

我设法通过将onAuthStateChanged逻辑移出app.js并进入componentWillMount的初始主页来解决这个问题。现在看起来像这样:

componentWillMount() {
const { navigate } = this.props.navigation;
firebase.auth().onAuthStateChanged((user) => {
  if (user) {

    SplashScreen.hide()
    this.setState({ loading: false })

    this.props.persistedUserLoginSuccess({user, navigate})

    this.props.fetchUserData();

  } else {

    SplashScreen.hide()
    this.setState({ loading: false })

  }
});

此外,我设法通过强制启动屏幕以保持查询身份验证来改善用户体验。完成后,闪存屏幕被隐藏,应用程序作为登录的应用程序或用户尚未登录的应用程序加载。

答案 1 :(得分:0)

此问题是因为您在登录后没有执行Firebase.auth()。signOut()。尝试signOut(用于测试,您始终可以在componentWillMount函数中注销),您将能够看到onAuthStateChanged通知。