我有一个相当简单的React native/Redux应用程序,并且最近添加了Redux与AsyncStorage一起坚持以帮助在重新加载时结转状态。使用React Native/Redux和Firebase持续进行身份验证
但是,我有问题让Firebase重新验证用户身份。我想知道是否有人有经验,因为我对Redux和Firebase都很陌生。为了更加清楚,我希望用户登录一次,然后每次打开应用时都不要再次登录。
我的登录用户动作:
export const loginUser = ({ email, password }) => {
return (dispatch) => {
dispatch({ type: LOGIN_USER });
firebase.auth().signInWithEmailAndPassword(email, password)
.then(user => loginUserSuccess(dispatch, user))
.catch(() => {
firebase.auth().createUserWithEmailAndPassword(email, password)
.then(user => loginUserSuccess(dispatch, user))
.catch(() => loginUserFail(dispatch));
});
};
};
我App.js:
class App extends Component {
constructor() {
super();
this.state = {
rehydrated: false,
store
};
}
componentDidMount() {
const persistor = persistStore(
store,
{
storage: AsyncStorage,
whitelist: ['auth']
},
() => { this.setState({ rehydrated: true }); }
);
AppState.addEventListener('change',() => this.handleAppLoaded(AppState.currentState));
const firebase_config = {
apiKey: Config.FIREBASE_API_KEY,
authDomain: `${Config.FIREBASE_PROJECT_NAME}.firebaseapp.com`,
databaseURL: `https://${Config.FIREBASE_PROJECT_NAME}.firebaseio.com`,
storageBucket: `${Config.FIREBASE_PROJECT_NAME}.appspot.com`,
messagingSenderId: Config.FIREBASE_MESSAGE_ID
};
firebase.initializeApp(firebase_config);
}
componentWillUnmount() {
AppState.removeEventListener('change',() => this.handleAppLoaded(AppState.currentState));
}
handleAppLoaded(state) {
if (state === 'active') {
store.dispatch(renewToken(store.getState()));
}
return null;
}
render() {
if (!this.state.rehydrated)
return null;
this.handleAppLoaded(AppState.currentState);
return (
<Provider store={store}>
<RouterWithRedux />
</Provider>
);
}
}
export default App;
有人能指出我在正确的方向?我试图做一个reauthUser操作,但因为我无法找到重新验证用户的方式而陷入困境,因为Auth对象不包含密码(显然是出于安全原因)
重新加载后,Firebase会话应该保留。 onAuthStateChanged侦听器是检测该状态的正确方法。重新启动应用程序后,您的Firebase会话不会持续吗?最近Firebase修复了与反应原生状态持久性相关的错误。确保在测试之前更新到最新版本。 – bojeil
重新加载后,Firebase会话确实存在。我的问题是如何让React Native通过Firebase凭证重新进行身份验证。我已经通过持久化身份验证状态解决了这个问题,并且在重新打开时检查用户是否存在,然后在这种情况下登录它们。 – phil
从newb道歉,因为我可能误解了我的问题。 Firebase不是问题,而是我在应用程序中坚持自己的状态。 – phil