2016-12-25 115 views
7

我有一个相当简单的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对象不包含密码(显然是出于安全原因)

+0

重新加载后,Firebase会话应该保留。 onAuthStateChanged侦听器是检测该状态的正确方法。重新启动应用程序后,您的Firebase会话不会持续吗?最近Firebase修复了与反应原生状态持久性相关的错误。确保在测试之前更新到最新版本。 – bojeil

+0

重新加载后,Firebase会话确实存在。我的问题是如何让React Native通过Firebase凭证重新进行身份验证。我已经通过持久化身份验证状态解决了这个问题,并且在重新打开时检查用户是否存在,然后在这种情况下登录它们。 – phil

+0

从newb道歉,因为我可能误解了我的问题。 Firebase不是问题,而是我在应用程序中坚持自己的状态。 – phil

回答