احراز هویت فایربیس در اپلیکیشن ری اکت نیتیو – از صفر تا صد


در این مقاله با روش تنظیم احراز هویت فایربیس در اپلیکیشن ری اکت نیتیو آشنا خواهیم شد. فایربیس (Firebase) قابلیتهای عالی زیادی ارائه کرده است که به ما امکان میدهند تا اپلیکیشنهای موبایل را با سرعت بالایی توسعه دهیم. از جمله این قابلیتها میتوان به Realtime Database ،Authentication ،Cloud Firestore ،Cloud Functions ،Crashlytics و موارد متعدد دیگری اشاره کرد. در ادامه یک گردش کار احراز هویت ساده با استفاده از ایمیل و رمز عبور خواهیم ساخت.
تنها چیزی که برای این اپلیکیشن نیاز داریم، استفاده از Firebase SDK روی یک اپلیکیشن ریاکت نیتیو است. به لطف Invertase که اسکریپت را ساخته است، یک پروژه اوپن سورس داریم که احراز هویت فایربیس را به اپلیکیشن ریاکت نیتیو وصل میکند.
راهاندازی اپلیکیشن
از آنجا که کار خود را از صفر آغاز میکنیم، میتوانیم از کیت آغازین ابتدایی که از سوی react-native-firebase (+) ایجاد شده است استفاده کنیم. اگر از قبل اپلیکیشنی دارید، میتوانید به لینک فوق رفته و دستورالعملهای مربوطه را پیگیری کنید. زمانی که با هر یک از دو روش فوق جلو رفتید و اپلیکیشن را آماده ساختید، آماده رفتن به مرحله بعدی راهنما هستیم.
فعالسازی احراز هویت ایمیل و رمز عبور در فایربیس
پس از آن که از دستورالعملهای لینک بخش قبلی پیروی کردید، اینک پروژه آماده آغاز است. نمودار زیر چیزی که میخواهیم بسازیم را توصیف میکند:
برای این که به کاربران اجازه بدهیم با استفاده از ترکیب ایمیل و رمز عبور ثبت نام بکنند، باید این امکان را در کنسول فایربیس فعال کنیم. به این منظور به منوی Firebase Project → Authentication → Sign-in Method میرویم. روی Email/Password کلیک کرده و آن را روی enabled تنظیم کرده و ذخیره کنید. بدین ترتیب داشبورد به شکل زیر درمیآید:
ایجاد صفحهها
اگر به نمودار ابتدای مقاله نگاه کنید، میبینید که چهار صفحه به صورت Loading،SignUp،Login، و Main داریم.
صفحه Loading تا زمانی که وضعیت احراز هویت یک کاربر مشخص نشده است، نمایش خواهد یافت. صفحه SignUp جایی است که کاربر یک حساب ایجاد میکند. صفحه Login به منظور وارد شدن کاربر طراحی شده است و صفحه Main نیز همان صفحه اصلی اپلیکیشن است که تنها برای کاربران احراز هویت شده نمایش پیدا میکند.
ما برای ناوبری در اپلیکیشن از react-navigation استفاده میکنیم و از این رو navigator را تنظیم کرده و صفحهها را ایجاد میکنیم:
yarn add react-navigation
در ادامه صفحهها را میسازیم:
- فایل Loading.js
1// Loading.js
2import React from 'react'
3import { View, Text, ActivityIndicator, StyleSheet } from 'react-native'
4export default class Loading extends React.Component {
5 render() {
6 return (
7 <View style={styles.container}>
8 <Text>Loading</Text>
9 <ActivityIndicator size="large" />
10 </View>
11 )
12 }
13}
14const styles = StyleSheet.create({
15 container: {
16 flex: 1,
17 justifyContent: 'center',
18 alignItems: 'center',
19 }
20})
- فایل SignUp.js
1// SignUp.js
2import React from 'react'
3import { StyleSheet, Text, TextInput, View, Button } from 'react-native'
4export default class SignUp extends React.Component {
5 state = { email: '', password: '', errorMessage: null }
6handleSignUp = () => {
7 // TODO: Firebase stuff...
8 console.log('handleSignUp')
9}
10render() {
11 return (
12 <View style={styles.container}>
13 <Text>Sign Up</Text>
14 {this.state.errorMessage &&
15 <Text style={{ color: 'red' }}>
16 {this.state.errorMessage}
17 </Text>}
18 <TextInput
19 placeholder="Email"
20 autoCapitalize="none"
21 style={styles.textInput}
22 onChangeText={email => this.setState({ email })}
23 value={this.state.email}
24 />
25 <TextInput
26 secureTextEntry
27 placeholder="Password"
28 autoCapitalize="none"
29 style={styles.textInput}
30 onChangeText={password => this.setState({ password })}
31 value={this.state.password}
32 />
33 <Button title="Sign Up" onPress={this.handleSignUp} />
34 <Button
35 title="Already have an account? Login"
36 onPress={() => this.props.navigation.navigate('Login')}
37 />
38 </View>
39 )
40 }
41}
42const styles = StyleSheet.create({
43 container: {
44 flex: 1,
45 justifyContent: 'center',
46 alignItems: 'center'
47 },
48 textInput: {
49 height: 40,
50 width: '90%',
51 borderColor: 'gray',
52 borderWidth: 1,
53 marginTop: 8
54 }
55})
- فایل Login.js
1// Login.js
2import React from 'react'
3import { StyleSheet, Text, TextInput, View, Button } from 'react-native'
4export default class Login extends React.Component {
5 state = { email: '', password: '', errorMessage: null }
6 handleLogin = () => {
7 // TODO: Firebase stuff...
8 console.log('handleLogin')
9 }
10 render() {
11 return (
12 <View style={styles.container}>
13 <Text>Login</Text>
14 {this.state.errorMessage &&
15 <Text style={{ color: 'red' }}>
16 {this.state.errorMessage}
17 </Text>}
18 <TextInput
19 style={styles.textInput}
20 autoCapitalize="none"
21 placeholder="Email"
22 onChangeText={email => this.setState({ email })}
23 value={this.state.email}
24 />
25 <TextInput
26 secureTextEntry
27 style={styles.textInput}
28 autoCapitalize="none"
29 placeholder="Password"
30 onChangeText={password => this.setState({ password })}
31 value={this.state.password}
32 />
33 <Button title="Login" onPress={this.handleLogin} />
34 <Button
35 title="Don't have an account? Sign Up"
36 onPress={() => this.props.navigation.navigate('SignUp')}
37 />
38 </View>
39 )
40 }
41}
42const styles = StyleSheet.create({
43 container: {
44 flex: 1,
45 justifyContent: 'center',
46 alignItems: 'center'
47 },
48 textInput: {
49 height: 40,
50 width: '90%',
51 borderColor: 'gray',
52 borderWidth: 1,
53 marginTop: 8
54 }
55})
- فایل Main.js
1// Main.js
2import React from 'react'
3import { StyleSheet, Platform, Image, Text, View } from 'react-native'
4export default class Main extends React.Component {
5 state = { currentUser: null }
6render() {
7 const { currentUser } = this.state
8return (
9 <View style={styles.container}>
10 <Text>
11 Hi {currentUser && currentUser.email}!
12 </Text>
13 </View>
14 )
15 }
16}
17const styles = StyleSheet.create({
18 container: {
19 flex: 1,
20 justifyContent: 'center',
21 alignItems: 'center'
22 }
23})
اکنون که همه صفحهها را ایجاد کردیم، شروع به اتصال ناوبری درون فایل App.js میکنیم:
- فایل App.js
1import React from 'react'
2import { StyleSheet, Platform, Image, Text, View } from 'react-native'
3import { SwitchNavigator } from 'react-navigation'
4// import the different screens
5import Loading from './Loading'
6import SignUp from './SignUp'
7import Login from './Login'
8import Main from './Main'
9// create our app's navigation stack
10const App = SwitchNavigator(
11 {
12 Loading,
13 SignUp,
14 Login,
15 Main
16 },
17 {
18 initialRouteName: 'Loading'
19 }
20)
21export default App
اینک اگر اپلیکیشن را آغاز کنیم، باید صفحه Loading را ببینیم که اسپینر ActivityIndicator در حال چرخش است. این همان چیزی است که انتظار داریم، زیرا باید تعیین کنیم آیا کاربر احراز هویت شده است یا نه تا بتوانیم وی را مسیریابی کنیم. اگر کاربر احراز هویت شود، او را به صفحه Main هدایت خواهیم کرد. در غیر این صورت او را به صفحه SignUp هدایت میکنیم.
تعیین اینکه کاربر احراز هویت شده یا نه
از فایربیس میتوان برای تعیین این که وضعیت احراز هویت کاربر چگونه است استفاده کرد. در ادامه در صفحه Loading بررسی میکنیم آیا کاربر وارد شده است یا نه.
1// Loading.js
2// Omitted other imports...
3import firebase from 'react-native-firebase'
4export default class Loading extends React.Component {
5 componentDidMount() {
6 firebase.auth().onAuthStateChanged(user => {
7 this.props.navigation.navigate(user ? 'Main' : 'SignUp')
8 })
9 }
10// Omitted the rest of the file...
از شنونده onAuthStateChanged در فایربیس برای دریافت وضعیت کنونی کاربر استفاده میکنیم. اگر احراز هویت شده باشد، او را به صفحه Main و در غیر این صورت به صفحه SignUp هدایت خواهیم کرد.
ثبت نام یک کاربر
ما باید یک کاربر جدید ایجاد کنیم، تا وی بتواند وارد اپلیکیشن شود. به این منظور به صفحه SignUp میرویم و متد handleSignUp را اتصال میدهیم:
1// SignUp.js
2// Omitted other imports...
3import firebase from 'react-native-firebase'
4export default class SignUp extends React.Component {
5 state = { email: '', password: '', errorMessage: null }
6 handleSignUp = () => {
7 firebase
8 .auth()
9 .createUserWithEmailAndPassword(this.state.email, this.state.password)
10 .then(() => this.props.navigation.navigate('Main'))
11 .catch(error => this.setState({ errorMessage: error.message }))
12 }
13// Omitted the rest of the file...
زمانی که یک کاربر فرم را تحویل دهد، ما با استفاده از متد createUserWithEmailAndPassword کاربر را ایجاد کرده وی را به صفحه Main هدایت میکنیم. اگر خطایی رخ بدهد این خطا نمایش خواهد یافت.
نمایش کاربر کنونی روی صفحه Main
در پیادهسازی کنونی تنها در صورتی که کاربر وارد شده باشد، صفحه Main نمایش مییابد. ما باید کاربر جاری (currentUser) را از فایربیس بگیریم تا بتوانیم ایمیلش را نمایش دهیم. بنابراین صفحه Main را به صورت زیر بهروزرسانی میکنیم تا این مسئله را مدیریت کند.
1// Main.js
2// Omitted other imports...
3import firebase from 'react-native-firebase'
4export default class Main extends React.Component {
5 state = { currentUser: null }
6 componentDidMount() {
7 const { currentUser } = firebase.auth()
8 this.setState({ currentUser })
9}
10// Omitted the rest of the file...
اکنون زمانی که صفحه Main را ببینیم باید نشانی کاربر جاری را نشان دهد. اگر اپلیکیشن را رفرش کنیم، باید به صورت خودکار به صفحه Main برود، زیرا قبلاً احراز هویت شده است. آخرین گام این است که کاربر بتواند پس از این که حساب را ایجاد کرد، وارد اپلیکیشن شود.
ورود کاربری که قبلاً حساب ایجاد کرده است
صفحه Login را طوری بهروزرسانی میکنیم که بتوانیم با حساب موجود وارد اپلیکیشن شویم:
1// Login.js
2// Omitted other imports...
3import firebase from 'react-native-firebase'
4export default class Login extends React.Component {
5 state = { email: '', password: '', errorMessage: null }
6 handleLogin = () => {
7 const { email, pasword } = this.state
8 firebase
9 .auth()
10 .signInWithEmailAndPassword(email, password)
11 .then(() => this.props.navigation.navigate('Main'))
12 .catch(error => this.setState({ errorMessage: error.message }))
13 }
14// Omitted the rest of the file...
اکنون یک گردش کار احراز هویت ساده داریم که با استفاده از فایربیس و ریاکت نیتیو راهاندازی شده است. برای دیدن سورس کد کامل این پروژه به این ریپوی گیتهاب (+) مراجعه کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای JavaScript (جاوا اسکریپت)
- مجموعه آموزشهای برنامهنویسی
- آموزش مقدماتی فریمورک React Native
- ژست های لمسی (Gestures) در React Native — راهنمای کاربردی
- افزودن صفحه آغازین (Splash Screen) به اپ React Native — از صفر تا صد
==