Javascript 在React Native中进行firebase身份验证后无法重定向到主屏幕

Javascript 在React Native中进行firebase身份验证后无法重定向到主屏幕,javascript,react-native,firebase-authentication,expo,Javascript,React Native,Firebase Authentication,Expo,我正在使用expo google登录在我的react本机应用程序中进行身份验证。使用firebase作为后端,用户需要首先通过身份验证才能访问主屏幕。根据以下代码,用户通过firebase real数据库保存的凭据和用户身份验证选项成功进行身份验证。 当用户在成功的身份验证后没有被引导到主屏幕时,问题就会出现。它们被重定向到登录屏幕 import 'react-native-gesture-handler'; import React, {useEffect,useState} from

我正在使用expo google登录在我的react本机应用程序中进行身份验证。使用firebase作为后端,用户需要首先通过身份验证才能访问主屏幕。根据以下代码,用户通过firebase real数据库保存的凭据和用户身份验证选项成功进行身份验证。 当用户在成功的身份验证后没有被引导到主屏幕时,问题就会出现。它们被重定向到登录屏幕

import 'react-native-gesture-handler';
    import React, {useEffect,useState} from 'react';
    //import { View, Text } from 'react-native';
    import { NavigationContainer } from '@react-navigation/native';
    import { createStackNavigator } from '@react-navigation/stack';
    //import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'
    import LogInScreen from '../Navigation/Screens/LogInScreen'
    import HomeScreen from '../Navigation/Screens/HomeScreen'
    import CreateAlertScreen from '../Navigation/Screens/CreateAlertScreen'
    import AlertScreen from '../Navigation/Screens/AlertScreen'
    import LoadingScreen from '../Navigation/Screens/LoadingScreen' 
    import {firebase} from '../firebase/config'
    
    const Stack = createStackNavigator()
    
    const MainStackNavigation = () =>{
    
      const [loading, setLoading] = useState(true)
      const [user, setUser] = useState(null)
    
      useEffect(() => {
        const usersRef = firebase.firestore().collection('users');
        firebase.auth().onAuthStateChanged(user => {
          if (user) {
            usersRef
              .doc(user.uid)
              .get()
              .then((document) => {
                const userData = document.data()
                setLoading(false)
                setUser(userData)
              })
              .catch((error) => {
                setLoading(false)
              });
          } else {
            setLoading(false)
          }
        });
      }, []);
      if (loading) {
        return (
          <></>
        )
      }
    
      return(
        <NavigationContainer>
          <Stack.Navigator >
          { user ? (
            <>
              <Stack.Screen name="Home">
                {props => <HomeScreen {...props} extraData={user} />}
              </Stack.Screen>
              <Stack.Screen name="AlertScreen" component={AlertScreen}/>
            <Stack.Screen name="CreateAlertScreen" component={CreateAlertScreen}/>
              </>
            ) : (
              
               <Stack.Screen name="LogInScreen" component={LogInScreen}/>
          
              
            )}
    
            
          
         </Stack.Navigator>
        </NavigationContainer>
    
      );
    }
    export default MainStackNavigation
    

        
导入“反应本机手势处理程序”;
从“React”导入React,{useffect,useState};
//从“react native”导入{View,Text};
从'@react-navigation/native'导入{NavigationContainer};
从'@react navigation/stack'导入{createStackNavigator};
//从“@react navigation/bottom tabs”导入{createBottomTabNavigator}
从“../Navigation/Screens/LogInScreen”导入LogInScreen
从“../Navigation/Screens/HomeScreen”导入主屏幕
从“../Navigation/Screens/CreateAlertScreen”导入CreateAlertScreen
从“../Navigation/Screens/AlertScreen”导入AlertScreen
从“../Navigation/Screens/LoadingScreen”导入加载屏幕
从“../firebase/config”导入{firebase}
const Stack=createStackNavigator()
常量MainStackNavigation=()=>{
常量[loading,setLoading]=useState(true)
const[user,setUser]=useState(null)
useffect(()=>{
const usersRef=firebase.firestore().collection('users');
firebase.auth().onAuthStateChanged(用户=>{
如果(用户){
usersRef
.doc(user.uid)
.get()
。然后((文档)=>{
const userData=document.data()
设置加载(错误)
setUser(userData)
})
.catch((错误)=>{
设置加载(错误)
});
}否则{
设置加载(错误)
}
});
}, []);
如果(装载){
返回(
)
}
返回(
{用户(
{props=>}
) : (
)}
);
}
导出默认主堆栈导航
//登录屏幕

import React from 'react'
import { View, Button, StyleSheet } from 'react-native'
import * as Google from 'expo-google-app-auth';
import {firebase} from '../../firebase/config'

const LogInScreen = () => {

  const isUserEqual =(googleUser, firebaseUser)=> {
    if (firebaseUser) {
      var providerData = firebaseUser.providerData;
      for (var i = 0; i < providerData.length; i++) {
        if (providerData[i].providerId === firebase.auth.GoogleAuthProvider.PROVIDER_ID &&
           providerData[i].uid === googleUser.user.id) {
           return true;
        }
      
        
      }
    }
    return false;
  }
  

  const onSignIn = (googleUser) => {
    console.log('Google Auth Response', googleUser);
    // We need to register an Observer on Firebase Auth to make sure auth is initialized.
    var unsubscribe = firebase.auth().onAuthStateChanged(
      function(firebaseUser) {
        unsubscribe();
        // Check if we are already signed-in Firebase with the correct user.
        if (!isUserEqual(googleUser, firebaseUser)) {
          // Build Firebase credential with the Google ID token.
          var credential = firebase.auth.GoogleAuthProvider.credential(
            googleUser.idToken,
            googleUser.accessToken
          );
          // Sign in with credential from the Google user.
          firebase
            .auth()
            .signInWithCredential(credential)
              .then(function(result) {
              console.log('user signed in ');
              if (result.additionalUserInfo.isNewUser) {
                firebase
                  .database()
                  .ref('/users/' + result.user.uid)
                  .set({
                    gmail: result.user.email,
                    profile_picture: result.additionalUserInfo.profile.picture,
                    first_name: result.additionalUserInfo.profile.given_name,
                    last_name: result.additionalUserInfo.profile.family_name,
                    created_at: Date.now()
                  })
                  .then(function(snapshot) {
                    // console.log('Snapshot', snapshot);
                  });
              } else {
                firebase
                  .database()
                  .ref('/users/' + result.user.uid)
                  .update({
                    last_logged_in: Date.now()
                  });
              }
            })
            .catch(function(error) {
              // Handle Errors here.
              var errorCode = error.code;
              var errorMessage = error.message;
              // The email of the user's account used.
              var email = error.email;
              // The firebase.auth.AuthCredential type that was used.
              var credential = error.credential;
              // ...
            });
        } else {
          console.log('User already signed-in Firebase.');
        }
      }
    );
  };
        
        
const signInWithGoogleAsync = async() => {
  try {
    const result = await Google.logInAsync({
      behavior:"web",
      androidClientId: '762894301670-gt5nvlevp6i94bkglqj3h5b8dhfrrj9u.apps.googleusercontent.com' ,
      //iosClientId: YOUR_CLIENT_ID_HERE,
      scopes: ['profile', 'email'],
    });

    if (result.type === 'success') {
      
      onSignIn(result)
      
      
      return result.accessToken;
    } else {
      return { cancelled: true };
    }
  } catch (e) {
    return { error: true };
  }
}

  return (
   <View style={styles.container}>
     <Button
     title="Sign In with Google"
     onPress={() =>signInWithGoogleAsync() }
     />
   </View>
  )
}

export default LogInScreen

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  }

})
从“React”导入React
从“react native”导入{视图、按钮、样式表}
从“expo Google app auth”导入*作为Google;
从“../../firebase/config”导入{firebase}
常量登录屏幕=()=>{
const isUserEqual=(谷歌用户、firebaseUser)=>{
if(firebaseUser){
var providerData=firebaseUser.providerData;
对于(变量i=0;i{
log('googleauth Response',googleUser);
//我们需要在Firebase Auth上注册一个观察者,以确保Auth已初始化。
var unsubscribe=firebase.auth().onAuthStateChanged(
功能(firebaseUser){
取消订阅();
//检查我们是否已使用正确的用户登录Firebase。
如果(!isUserEqual(谷歌用户、firebaseUser)){
//使用Google ID令牌构建Firebase凭据。
var-credential=firebase.auth.GoogleAuthProvider.credential(
googleUser.idToken,
googleUser.accessToken
);
//使用来自Google用户的凭据登录。
火基
.auth()
.signiWithCredential(凭证)
.然后(函数(结果){
log(“用户登录”);
if(result.additionalUserInfo.isNewUser){
火基
.数据库()
.ref('/users/'+result.user.uid)
.设置({
gmail:result.user.email,
profile\u picture:result.additionalUserInfo.profile.picture,
第一个\u名称:result.additionalUserInfo.profile.given\u名称,
姓氏:result.additionalUserInfo.profile.family\u name,
创建时间:Date.now()
})
.then(功能(快照){
//console.log('Snapshot',Snapshot);
});
}否则{
火基
.数据库()
.ref('/users/'+result.user.uid)
.更新({
上次登录日期:Date.now()
});
}
})
.catch(函数(错误){
//在这里处理错误。
var errorCode=error.code;
var errorMessage=error.message;
//使用的用户帐户的电子邮件。
var email=error.email;
//使用的firebase.auth.AuthCredential类型。
var-credential=error.credential;
// ...
});
}否则{
log('用户已登录Firebase');
}
}
);
};
const signInWithGoogleAsync=async()=>{
试一试{
const result=wait Google.logInAsync({
行为:“网络”,
androidClientId:'762894301670-gt5nvlevp6i94bkglqj3h5b8dhfrrj9u.apps.googleusercontent.com',
//iosClientId:这里是你的客户ID,
范围:['profile','email'],
});
如果(result.type==='success'){
onSignIn(结果)
返回result.accessToken;
}否则{
返回{已取消:true};
}
}捕获(e){
雷图
import React from 'react'
import { View, Text, StyleSheet, Button } from 'react-native'
import {firebase} from '../../firebase/config'

function HomeScreen({navigation}) {
    return (
        <View style={styles.container}>
        <Text> Profile Screen </Text>
        <Text style={{ fontSize: 20, fontWeight: "bold" }}>
        Welcome
        </Text>
        <Button
        title="Create an alert"
        onPress={() => navigation.navigate('CreateAlertScreen')}/>
       <Button
       title="LogOut"
       onPress={() =>firebase.auth().signOut()} 
       
       
       />
      </View>
        
    )
}
export default HomeScreen
const styles = StyleSheet.create({
    container: {
        flex: 1,
        alignItems: "center"
    }


})