在React Native应用程序中使用Firebase进行电子邮件身份验证
这是我们的第六篇文章 反应原生 Firebase 系列,在这个例子中我们将看到什么是 Firebase 身份验证模块? 以及如何在 React Native 应用程序中集成 Firebase 身份验证? 在此示例中,我们将在 React Native 应用程序中使用 Firebase 身份验证进行电子邮件身份验证。
让我们从 Firebase 身份验证示例开始。
推荐:React Native开发功能组件
Firebase 身份验证
Firebase 身份验证提供后端服务和易于使用的 SDK 来对您的应用的用户进行身份验证。 它支持使用密码、电话号码、流行的联合身份提供商(如 Google、Facebook 和 Twitter 等)进行身份验证。
Firebase 身份验证与其他 Firebase 服务紧密集成,并利用 OAuth 2.0 和 OpenID Connect 等行业标准,因此可以轻松与您的自定义后端集成。
简而言之,Firebase 身份验证将帮助您保留基本的用户详细信息,这可以帮助您对用户进行身份验证。 您可以使用电子邮件/电话通知,它可以帮助您创建我们在本示例中创建的完整身份验证流程。 您还可以使用任何社交身份验证,并将其与 Firebase 身份验证连接起来,而不是创建自己的注册机制。
Firebase 不提供任何社交身份验证机制,开发人员必须从他/她的一端实现相同的机制。
示例说明
在本例中,我们将使用电子邮件+密码进行身份验证。 用户可以使用电子邮件和密码注册,并可以使用相同的电子邮件和密码登录。
如果我们谈论应用程序,那么我们将创建一个启动屏幕,我们将在其中检查用户是否通过身份验证,如果没有,那么我们将显示登录屏幕或主屏幕。 用户可以使用注册表进行注册。 我们将在主屏幕上提供一个注销按钮,以帮助我们注销。 让我们看一下代码,以便更清楚地了解。
制作 React Native 应用程序
React Native 入门将帮助您更多地了解如何制作 React Native 项目。 我们将使用 React Native 命令行界面来制作我们的 React Native 应用程序。
如果您之前安装了全局的react-native-cli软件包,请将其删除,因为它可能会导致意外问题:
npm uninstall -g react-native-cli @react-native-community/cli
运行以下命令创建一个新的 React Native 项目
npx react-native init ProjectName
如果你想使用特定的 React Native 版本启动一个新项目,你可以使用 –version 参数:
npx react-native init ProjectName --version X.XX.X
注意如果上述命令失败,您可能使用的是旧版本 react-native
或者 react-native-cli
在您的电脑上全局安装。 尝试卸载 cli 并使用 npx 运行 cli。
这将在项目目录中创建一个带有名为 App.js 的索引文件的项目结构。
Firebase SDK 集成
要从任何 React Native Firebase 示例开始,您需要将 Firebase 集成到您的应用程序中,我专门为此详细制作了一篇单独的文章,您将在其中看到在 Android 版 React Native 应用程序中添加 Firebase 的点对点过程,以及iOS 两者都有。
请访问如何在 Android 和 iOS 应用程序中集成 Firebase,然后返回执行下一步。
完成 Firebase 集成后,您可以安装更多依赖项。
安装依赖项
要安装依赖项,请打开终端并使用以下命令跳转到您的项目
cd ProjectName
对于 React Native Firebase,我们需要安装和设置应用程序模块
npm install @react-native-firebase/app --save
现在安装身份验证模块
npm install @react-native-firebase/auth --save
这对于 Firebase 身份验证来说已经足够了,但在本示例中,我们还将使用 React Navigation,因为我们将切换屏幕,因此还要安装以下 React-navigation 依赖项
npm install @react-navigation/native --save
其他用于反应导航的支持库
npm install react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view --save
npm install @react-navigation/stack --save
此命令会将所有依赖项复制到您的 node_module 目录中。 –save 是可选的,它只是更新 package.json 文件中的依赖项。
CocoaPods 安装
React Native 0.60 更新后,他们引入了自动链接,因此我们不需要链接库,但对于 iOS,我们需要安装 pod。 因此要安装 pod,请使用
cd ios/ && pod install --repo-update && cd ..
设置身份验证
在开始这个示例之前,我们必须进行一些设置。 打开你的 Firebase 控制台 并单击左侧窗格中的“身份验证”选项卡。
单击“设置登录方法”,您将看到登录提供商,单击“电子邮件/密码”
使能够 “电子邮件/密码” 并保存。 这将启用电子邮件身份验证。 如果您想要任何不同的身份验证,那么您也可以启用相同的身份验证。
Firebase 身份验证的项目结构
请创建以下项目结构并复制下面给出的代码。
你可以看到
- 应用程序.js 包含主要导航
- SplashScreen.js 对于启动画面
- 登录屏幕.js 用于登录
- 注册屏幕.js 对于登记册
- 主屏.js,作为登录/注册后的登陆页面并具有注销选项
React Native 中的 Firebase 身份验证代码
请在任何代码编辑器中打开 App.js 并将代码替换为以下代码
应用程序.js
// #6 Email Authentication using Firebase Authentication in React Native App
// https://aboutreact.com/react-native-firebase-authentication/
import "react-native-gesture-handler";
// Import React and Component
import React from "react";
// Import Navigators from React Navigation
import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
// Import Screens
import SplashScreen from "./pages/SplashScreen";
import LoginScreen from "./pages/LoginScreen";
import RegisterScreen from "./pages/RegisterScreen";
import HomeScreen from "./pages/HomeScreen";
const Stack = createStackNavigator();
const Auth = () => {
// Stack Navigator for Login and Sign up Screen
return (
<Stack.Navigator initialRouteName="LoginScreen">
<Stack.Screen
name="LoginScreen"
component={LoginScreen}
options={{ headerShown: false }}
/>
<Stack.Screen
name="RegisterScreen"
component={RegisterScreen}
options={{
title: "Register", //Set Header Title
headerStyle: {
backgroundColor: "#307ecc", //Set Header color
},
headerTintColor: "#fff", //Set Header text color
headerTitleStyle: {
fontWeight: "bold", //Set Header text style
},
}}
/>
</Stack.Navigator>
);
};
/* Main Navigator */
const App = () => {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="SplashScreen">
{/* SplashScreen which will come once for 2 Seconds */}
<Stack.Screen
name="SplashScreen"
component={SplashScreen}
// Hiding header for Splash Screen
options={{ headerShown: false }}
/>
{/* Auth Navigator which include Login Signup */}
<Stack.Screen
name="Auth"
component={Auth}
options={{ headerShown: false }}
/>
<Stack.Screen
name="HomeScreen"
component={HomeScreen}
options={{
title: "Home", //Set Header Title
headerStyle: {
backgroundColor: "#307ecc", //Set Header color
},
headerTintColor: "#fff", //Set Header text color
headerTitleStyle: {
fontWeight: "bold", //Set Header text style
},
}}
/>
</Stack.Navigator>
</NavigationContainer>
);
};
export default App;
页面/SplashScreen.js
// #6 Email Authentication using Firebase Authentication in React Native App
// https://aboutreact.com/react-native-firebase-authentication/
// Import React and Component
import React, { useState, useEffect } from "react";
import {
SafeAreaView,
ActivityIndicator,
Text,
View,
StyleSheet,
Image,
} from "react-native";
import auth from "@react-native-firebase/auth";
const SplashScreen = ({ navigation }) => {
//State for ActivityIndicator animation
const (animating, setAnimating) = useState(true);
useEffect(() => {
setTimeout(() => {
setAnimating(false);
// Check if currentUser is set or not
// If not then send for Authentication
// else send to Home Screen
navigation.replace(
auth().currentUser ? "HomeScreen" : "Auth"
);
}, 5000);
}, ());
return (
<SafeAreaView
style={{ flex: 1, backgroundColor: "#307ecc" }}
>
<View style={styles.container}>
<Image
source={require("../Image/aboutreact.png")}
style={{
width: "90%",
resizeMode: "contain",
margin: 30,
}}
/>
<ActivityIndicator
animating={animating}
color="#FFFFFF"
size="large"
style={styles.activityIndicator}
/>
</View>
<Text
style={{
fontSize: 18,
textAlign: "center",
color: "white",
}}
>
React Native Firebase Authentication
</Text>
<Text
style={{
fontSize: 16,
textAlign: "center",
color: "white",
}}
>
www.aboutreact.com
</Text>
</SafeAreaView>
);
};
export default SplashScreen;
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: "center",
justifyContent: "center",
},
activityIndicator: {
alignItems: "center",
height: 80,
},
});
页面/LoginScreen.js
// #6 Email Authentication using Firebase Authentication in React Native App
// https://aboutreact.com/react-native-firebase-authentication/
// Import React and Component
import React, { useState, createRef } from "react";
import {
SafeAreaView,
StyleSheet,
TextInput,
View,
Text,
ScrollView,
Image,
Keyboard,
TouchableOpacity,
KeyboardAvoidingView,
} from "react-native";
import auth from "@react-native-firebase/auth";
const LoginScreen = ({ navigation }) => {
const (userEmail, setUserEmail) = useState("");
const (userPassword, setUserPassword) = useState("");
const (errortext, setErrortext) = useState("");
const passwordInputRef = createRef();
const handleSubmitPress = () => {
setErrortext("");
if (!userEmail) {
alert("Please fill Email");
return;
}
if (!userPassword) {
alert("Please fill Password");
return;
}
auth()
.signInWithEmailAndPassword(userEmail, userPassword)
.then((user) => {
console.log(user);
// If server response message same as Data Matched
if (user) navigation.replace("HomeScreen");
})
.catch((error) => {
console.log(error);
if (error.code === "auth/invalid-email")
setErrortext(error.message);
else if (error.code === "auth/user-not-found")
setErrortext("No User Found");
else {
setErrortext(
"Please check your email id or password"
);
}
});
};
return (
<SafeAreaView style={styles.mainBody}>
<ScrollView
keyboardShouldPersistTaps="handled"
contentContainerStyle={{
flex: 1,
justifyContent: "center",
alignContent: "center",
}}
>
<View>
<KeyboardAvoidingView enabled>
<View style={{ alignItems: "center" }}>
<Image
source={require("../Image/aboutreact.png")}
style={{
width: "50%",
height: 100,
resizeMode: "contain",
margin: 30,
}}
/>
</View>
<View style={styles.sectionStyle}>
<TextInput
style={styles.inputStyle}
onChangeText={(UserEmail) =>
setUserEmail(UserEmail)
}
placeholder="Enter Email"
placeholderTextColor="#8b9cb5"
autoCapitalize="none"
keyboardType="email-address"
returnKeyType="next"
onSubmitEditing={() =>
passwordInputRef.current &&
passwordInputRef.current.focus()
}
underlineColorAndroid="#f000"
blurOnSubmit={false}
/>
</View>
<View style={styles.sectionStyle}>
<TextInput
style={styles.inputStyle}
onChangeText={(UserPassword) =>
setUserPassword(UserPassword)
}
placeholder="Enter Password"
placeholderTextColor="#8b9cb5"
keyboardType="default"
ref={passwordInputRef}
onSubmitEditing={Keyboard.dismiss}
blurOnSubmit={false}
secureTextEntry={true}
underlineColorAndroid="#f000"
returnKeyType="next"
/>
</View>
{errortext != "" ? (
<Text style={styles.errorTextStyle}>
{" "}
{errortext}{" "}
</Text>
) : null}
<TouchableOpacity
style={styles.buttonStyle}
activeOpacity={0.5}
onPress={handleSubmitPress}
>
<Text style={styles.buttonTextStyle}>
LOGIN
</Text>
</TouchableOpacity>
<Text
style={styles.registerTextStyle}
onPress={() =>
navigation.navigate("RegisterScreen")
}
>
New Here ? Register
</Text>
</KeyboardAvoidingView>
</View>
</ScrollView>
<Text
style={{
fontSize: 18,
textAlign: "center",
color: "white",
}}
>
React Native Firebase Authentication
</Text>
<Text
style={{
fontSize: 16,
textAlign: "center",
color: "white",
}}
>
www.aboutreact.com
</Text>
</SafeAreaView>
);
};
export default LoginScreen;
const styles = StyleSheet.create({
mainBody: {
flex: 1,
justifyContent: "center",
backgroundColor: "#307ecc",
alignContent: "center",
},
sectionStyle: {
flexDirection: "row",
height: 40,
marginTop: 20,
marginLeft: 35,
marginRight: 35,
margin: 10,
},
buttonStyle: {
backgroundColor: "#7DE24E",
borderWidth: 0,
color: "#FFFFFF",
borderColor: "#7DE24E",
height: 40,
alignItems: "center",
borderRadius: 30,
marginLeft: 35,
marginRight: 35,
marginTop: 20,
marginBottom: 25,
},
buttonTextStyle: {
color: "#FFFFFF",
paddingVertical: 10,
fontSize: 16,
},
inputStyle: {
flex: 1,
color: "white",
paddingLeft: 15,
paddingRight: 15,
borderWidth: 1,
borderRadius: 30,
borderColor: "#dadae8",
},
registerTextStyle: {
color: "#FFFFFF",
textAlign: "center",
fontWeight: "bold",
fontSize: 14,
alignSelf: "center",
padding: 10,
},
errorTextStyle: {
color: "red",
textAlign: "center",
fontSize: 14,
},
});
页面/RegisterScreen.js
// #6 Email Authentication using Firebase Authentication in React Native App
// https://aboutreact.com/react-native-firebase-authentication/
// Import React and Component
import React, { useState, createRef } from "react";
import {
SafeAreaView,
StyleSheet,
TextInput,
View,
Text,
Image,
KeyboardAvoidingView,
Keyboard,
TouchableOpacity,
ScrollView,
} from "react-native";
import auth from "@react-native-firebase/auth";
const RegisterScreen = ({ navigation }) => {
const (userName, setUserName) = useState("");
const (userEmail, setUserEmail) = useState("");
const (userPassword, setUserPassword) = useState("");
const (errortext, setErrortext) = useState("");
const emailInputRef = createRef();
const passwordInputRef = createRef();
const handleSubmitButton = () => {
setErrortext("");
if (!userName) return alert("Please fill Name");
if (!userEmail) return alert("Please fill Email");
if (!userPassword) return alert("Please fill Address");
auth()
.createUserWithEmailAndPassword(
userEmail,
userPassword
)
.then((user) => {
console.log(
"Registration Successful. Please Login to proceed"
);
console.log(user);
if (user) {
auth()
.currentUser.updateProfile({
displayName: userName,
photoURL:
"https://aboutreact.com/profile.png",
})
.then(() => navigation.replace("HomeScreen"))
.catch((error) => {
alert(error);
console.error(error);
});
}
})
.catch((error) => {
console.log(error);
if (error.code === "auth/email-already-in-use") {
setErrortext(
"That email address is already in use!"
);
} else {
setErrortext(error.message);
}
});
};
return (
<SafeAreaView
style={{ flex: 1, backgroundColor: "#307ecc" }}
>
<ScrollView
keyboardShouldPersistTaps="handled"
contentContainerStyle={{
justifyContent: "center",
alignContent: "center",
}}
>
<View style={{ alignItems: "center" }}>
<Image
source={require("../Image/aboutreact.png")}
style={{
width: "50%",
height: 100,
resizeMode: "contain",
margin: 30,
}}
/>
</View>
<KeyboardAvoidingView enabled>
<View style={styles.sectionStyle}>
<TextInput
style={styles.inputStyle}
onChangeText={(UserName) =>
setUserName(UserName)
}
underlineColorAndroid="#f000"
placeholder="Enter Name"
placeholderTextColor="#8b9cb5"
autoCapitalize="sentences"
returnKeyType="next"
onSubmitEditing={() =>
emailInputRef.current &&
emailInputRef.current.focus()
}
blurOnSubmit={false}
/>
</View>
<View style={styles.sectionStyle}>
<TextInput
style={styles.inputStyle}
onChangeText={(UserEmail) =>
setUserEmail(UserEmail)
}
underlineColorAndroid="#f000"
placeholder="Enter Email"
placeholderTextColor="#8b9cb5"
keyboardType="email-address"
ref={emailInputRef}
returnKeyType="next"
onSubmitEditing={() =>
passwordInputRef.current &&
passwordInputRef.current.focus()
}
blurOnSubmit={false}
/>
</View>
<View style={styles.sectionStyle}>
<TextInput
style={styles.inputStyle}
onChangeText={(UserPassword) =>
setUserPassword(UserPassword)
}
underlineColorAndroid="#f000"
placeholder="Enter Password"
placeholderTextColor="#8b9cb5"
ref={passwordInputRef}
returnKeyType="next"
secureTextEntry={true}
onSubmitEditing={Keyboard.dismiss}
blurOnSubmit={false}
/>
</View>
{errortext != "" ? (
<Text style={styles.errorTextStyle}>
{" "}
{errortext}{" "}
</Text>
) : null}
<TouchableOpacity
style={styles.buttonStyle}
activeOpacity={0.5}
onPress={handleSubmitButton}
>
<Text style={styles.buttonTextStyle}>
REGISTER
</Text>
</TouchableOpacity>
</KeyboardAvoidingView>
</ScrollView>
<Text
style={{
fontSize: 18,
textAlign: "center",
color: "white",
}}
>
React Native Firebase Authentication
</Text>
<Text
style={{
fontSize: 16,
textAlign: "center",
color: "white",
}}
>
www.aboutreact.com
</Text>
</SafeAreaView>
);
};
export default RegisterScreen;
const styles = StyleSheet.create({
sectionStyle: {
flexDirection: "row",
height: 40,
marginTop: 20,
marginLeft: 35,
marginRight: 35,
margin: 10,
},
buttonStyle: {
backgroundColor: "#7DE24E",
borderWidth: 0,
color: "#FFFFFF",
borderColor: "#7DE24E",
height: 40,
alignItems: "center",
borderRadius: 30,
marginLeft: 35,
marginRight: 35,
marginTop: 20,
marginBottom: 20,
},
buttonTextStyle: {
color: "#FFFFFF",
paddingVertical: 10,
fontSize: 16,
},
inputStyle: {
flex: 1,
color: "white",
paddingLeft: 15,
paddingRight: 15,
borderWidth: 1,
borderRadius: 30,
borderColor: "#dadae8",
},
errorTextStyle: {
color: "red",
textAlign: "center",
fontSize: 14,
},
});
页面/HomeScreen.js
// #6 Email Authentication using Firebase Authentication in React Native App
// https://aboutreact.com/react-native-firebase-authentication/
// Import React and Component
import React, { useEffect, useState } from "react";
import {
View,
Text,
SafeAreaView,
StyleSheet,
TouchableOpacity,
Alert,
} from "react-native";
import auth from "@react-native-firebase/auth";
const HomeScreen = ({ navigation }) => {
const (user, setUser) = useState();
useEffect(() => {
const subscriber = auth().onAuthStateChanged((user) => {
console.log("user", JSON.stringify(user));
setUser(user);
});
return subscriber;
}, ());
const logout = () => {
Alert.alert(
"Logout",
"Are you sure? You want to logout?",
(
{
text: "Cancel",
onPress: () => {
return null;
},
},
{
text: "Confirm",
onPress: () => {
auth()
.signOut()
.then(() => navigation.replace("Auth"))
.catch((error) => {
console.log(error);
if (error.code === "auth/no-current-user")
navigation.replace("Auth");
else alert(error);
});
},
},
),
{ cancelable: false }
);
};
return (
<SafeAreaView style={{ flex: 1 }}>
<View style={{ flex: 1, padding: 16 }}>
<View
style={{
flex: 1,
alignItems: "center",
justifyContent: "center",
}}
>
<Text
style={{
fontSize: 20,
textAlign: "center",
marginBottom: 16,
}}
>
Firebase Auth
</Text>
{user ? (
<Text>
Welcome{" "}
{user.displayName
? user.displayName
: user.email}
</Text>
) : null}
<TouchableOpacity
style={styles.buttonStyle}
activeOpacity={0.5}
onPress={logout}
>
<Text style={styles.buttonTextStyle}>
Logout
</Text>
</TouchableOpacity>
</View>
<Text
style={{
fontSize: 18,
textAlign: "center",
color: "grey",
}}
>
React Native Firebase Authentication
</Text>
<Text
style={{
fontSize: 16,
textAlign: "center",
color: "grey",
}}
>
www.aboutreact.com
</Text>
</View>
</SafeAreaView>
);
};
export default HomeScreen;
const styles = StyleSheet.create({
buttonStyle: {
minWidth: 300,
backgroundColor: "#7DE24E",
borderWidth: 0,
color: "#FFFFFF",
borderColor: "#7DE24E",
height: 40,
alignItems: "center",
borderRadius: 30,
marginLeft: 35,
marginRight: 35,
marginTop: 20,
marginBottom: 25,
},
buttonTextStyle: {
color: "#FFFFFF",
paddingVertical: 10,
fontSize: 16,
},
});
运行 React Native 应用程序
再次打开终端并使用跳转到您的项目。
cd ProjectName
1. 启动 Metro Bundler
首先,您需要启动 Metro,React Native 附带的 JavaScript 捆绑器。 要启动 Metro 捆绑程序,请运行以下命令
npx react-native start
一旦您启动 Metro Bundler,它将永远在您的终端上运行,直到您将其关闭。 让 Metro Bundler 在自己的终端中运行。 打开一个新终端并运行该应用程序。
2.启动React Native应用程序
在 Android 虚拟设备或真实调试设备上运行项目
npx react-native run-android
或在 iOS 模拟器上运行(仅限 macOS)
npx react-native run-ios
输出截图
这就是我们如何在适用于 Android 和 iOS 的 React Native 应用程序中使用 Firebase 身份验证来实现电子邮件身份验证。 如果您有任何疑问或想分享有关该主题的内容,您可以在下面发表评论或在此处联系我们。