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