我无法在我的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
时遇到同样的问题我做错了什么?
是否有一种特殊的方法可以保持会话处于活动状态而我不在用?
答案 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通知。