React Native'de Navigasyon Yollarının Montajını ve Çıkarılmasını İşleme
Yayınlanan: 2022-03-10Bu yazımızda, React Native'de navigasyon rotalarının montajı ve sökülmesi adımlarını inceleyeceğiz. Uygulamanızın beklenen bir davranışı, kimlik doğrulama koşulu karşılandığında, yalnızca oturum açmış kullanıcılar için yeni bir gezinme rotaları kümesinin mevcut olması, kimlik doğrulamadan önce görüntülenen diğer ekranların ise kaldırılmadıkça ve geri döndürülememesidir. kullanıcı uygulamadan çıkış yapar.
Uygulamanızda güvenlik için, korumalı yollar size uygulamanızdaki belirli bilgileri/içeriği belirli kullanıcılara göstermenin bir yolunu sunarken, yetkisiz kişilerin erişimini kısıtlar.
Bu proje için Expo ile birlikte çalışacağız çünkü bu, birçok kurulum hakkında endişelenmek yerine elimizdeki soruna odaklanmamıza yardımcı olacak. Bu makaledeki tam olarak aynı adımlar, çıplak bir React Native uygulaması için izlenebilir.
Bu öğreticiyi takip etmek için JavaScript ve React Native hakkında biraz bilgi sahibi olmanız gerekir. İşte zaten aşina olmanız gereken birkaç önemli şey:
- React Native'de özel bileşenler (bileşenlerin nasıl oluşturulacağı, bir bileşende sahne öğelerinin nasıl alınacağı, iletileceği ve kullanılacağı). Daha fazla oku.
- Tepki Navigasyonu. Daha fazla oku.
- React Native'de Yığın Gezgini. Daha fazla oku.
- React Native Core bileşenleri hakkında temel bilgiler (
<View/>,<Text/>, vb.). Daha fazla oku. - Yerel
AsyncStoragetepki verin. Daha fazla oku. - Bağlam API'si. Daha fazla oku.
Proje Kurulumu ve Temel Kimlik Doğrulaması
Expo'yu kullanmaya yeni başladıysanız ve fuarın nasıl kurulacağını bilmiyorsanız, resmi belgeleri ziyaret edin. Kurulum tamamlandıktan sonra, komut istemimizden expo ile yeni bir React Native projesini başlatmaya devam edin:
expo init navigation-projectTemel kurulumun nasıl olmasını istediğinizi seçmeniz için bazı seçenekler sunulacaktır:
Bizim durumumuzda, projemizi boş bir belge olarak kurmak için ilk seçeneği seçelim. Şimdi JavaScript bağımlılıklarının kurulumu tamamlanana kadar bekleyin.
Uygulamamız kurulduktan sonra, dizinimizi yeni proje dizinimize değiştirebilir ve favori kod düzenleyicinizde açabiliriz. AsyncStorage için kullanacağımız kütüphaneyi ve navigasyon kütüphanelerimizi kurmamız gerekiyor. Terminalinizdeki klasör dizininizin içine yukarıdaki komutu yapıştırın ve proje bağımlılıklarımızı yüklemek için bir şablon seçin ( blank işe yarar).
Şimdi bu bağımlılıkların her birinin ne için olduğuna bakalım:
- @react-native-community/async-storage
Web'deki localStorage gibi, bir cihazda anahtar/değer çiftlerinde kalıcı veriler için bir React Native API'sidir. - @tepki-yerel-topluluk/maskeli-görünüm, tepki-yerel-ekranlar, tepki-yerel-jest-tutucu
Bu bağımlılıklar, çoğu gezgin tarafından uygulamada gezinme yapısını oluşturmak için kullanılan temel yardımcı programlardır. (React Native navigasyonunu kullanmaya başlama bölümünde daha fazlasını okuyun.) - @tepki-navigasyon/yerel
Bu, React Native navigasyonunun bağımlılığıdır. - @tepki-navigasyon/yığın
Bu, React Native'de yığın gezinme bağımlılığıdır.
npm install @react-native-community/async-storage @react-native-community/masked-view @react-navigation/native @react-navigation/stack react-native-screens react-native-gesture-handle Uygulamayı başlatmak için terminalinizdeki uygulama dizininden expo start kullanın. Uygulama başlatıldıktan sonra, cep telefonunuzdan expo uygulamasını kullanarak barkodu okutarak uygulamayı görüntüleyebilir veya android emülatör/IOS simülatörünüz varsa, expo geliştirici aracından uygulamayı bunlar üzerinden açabilirsiniz. bir expo uygulamasını başlattığınızda tarayıcınızda açılır. Bu makaledeki resim örnekleri için sonucumuzu görmek için Genymotions kullanacağız. Genymotions'ta nihai sonucumuz şöyle görünecek:
Klasör Yapıları
Klasör yapımızı baştan oluşturalım, böylece devam ederken onunla daha kolay çalışalım:
Önce iki klasöre ihtiyacımız var:
- bağlam
Global durum yönetimi için Context API ile çalışacağımızdan, bu klasör tüm uygulamamızın içeriğini tutacaktır. - Görüntüleme
Bu klasör, hem gezinme klasörünü hem de farklı ekranların görünümlerini tutacaktır.
Devam edin ve proje dizininizde iki klasör oluşturun.
Bağlam klasörünün içinde authContext adlı bir klasör oluşturun ve authContext klasörünün içinde iki dosya oluşturun:
- AuthContext.js ,
- AuthState.js .
Context API ile çalışmaya başladığımızda bu dosyalara ihtiyacımız olacak.
Şimdi oluşturduğumuz görünümler klasörüne gidin ve içinde iki klasör daha oluşturun, yani:
- navigasyon ,
- ekranlar .
Şimdi, henüz bitirmedik, ekranlar klasörünün içinde şu iki klasörü daha oluşturun:
- postAuthScreens ,
- önAuthScreens .
Klasör kurulumunu doğru takip ettiyseniz, şu anda klasör yapınızın nasıl görünmesi gerektiği:
İlk Ekranımızı Oluşturmak
Şimdi ilk ekranımızı oluşturalım ve buna preAuthScreens klasörünün içindeki karşılamaScreen.js adını verelim .
önAuthScreens > karşılamaScreen.js
İşte karşılamaScreen.js dosyamızın içeriği:
import React from 'react'; import { View, Text, Button, StyleSheet, TextInput } from 'react-native'; const WelcomeScreen = () => { const onUserAuthentication = () => { console.log("User authentication button clicked") } return ( <View style={styles.container}> <Text style={styles.header}>Welcome to our App!</Text> <View> <TextInput style={styles.inputs} placeholder="Enter your email here.." /> <TextInput style={styles.inputs} secureTextEntry={true} placeholder="Enter your password here.." /> <Button title="AUTHENTICATE" onPress={onUserAuthentication} /> </View> </View> ) } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center', }, header: { fontSize: 25, fontWeight: 'bold', marginBottom: 30 }, inputs: { width: 300, height: 40, marginBottom: 10, borderWidth: 1, } }) export default WelcomeScreenİşte yukarıdaki kod bloğunda yaptığımız şey:
İlk olarak, React Native kütüphanesinden ihtiyacımız olan şeyleri, yani View , Text , Button , TextInput dosyasını import ettik. Ardından, WelcomeScreen işlevsel bileşenimizi oluşturduk.
StyleSheet React Native'den içe aktardığımızı ve onu başlığımız ve ayrıca <TextInput /> için stilleri tanımlamak için kullandığımızı fark edeceksiniz.
Son olarak, kodun altındaki WelcomeScreen bileşenini dışa aktarıyoruz.
Artık bununla işimiz bittiğine göre, girdilerin değerlerini depolamak için useState kancasını kullanarak ve girdi alanlarında herhangi bir değişiklik olduğunda durumlarını güncelleyerek bu bileşeni beklendiği gibi çalıştıralım. Ayrıca, daha sonra bir işlevi tutmak için ihtiyaç duyacağımızdan, useCallback kancasını React'ten içe aktaracağız.
İlk olarak, hala WelcomeScreen bileşenindeyken, useState'i içe useState ve useCallback useCallback'i almamız gerekiyor.
import React, { useState, useCallback } from 'react'; Şimdi WelcomeScreen işlevsel bileşeninin içinde, sırasıyla e-posta ve parola için iki durumu oluşturalım:
... const WelcomeScreen = () => { const [email, setEmail] = useState('') const [password, setPassword] = useState('') return ( ... ) } ... Ardından, <TextInput /> alanlarımızı kendi durumlarından değerlerini alacak ve girişin değeri güncellendiğinde durumlarını güncelleyecek şekilde değiştirmemiz gerekiyor:
import React, { useState, useCallback } from 'react'; import { View, Text, Button, StyleSheet, TextInput } from 'react-native'; const WelcomeScreen = () => { const [email, setEmail] = useState('') const [password, setPassword] = useState('') const onInputChange = (value, setState) => { setState(value); } return ( <View> ... <View> <TextInput style={styles.inputs} placeholder="Enter your email here.." value={email} onChangeText={(value) => onInputChange(value, setEmail)} /> <TextInput style={styles.inputs} secureTextEntry={true} placeholder="Enter your password here.." value={password} onChangeText={(value) => onInputChange(value, setPassword)} /> ... </View> </View> ) } ...Yukarıdaki kodda, yaptığımız şey:
- Metin girdilerinin her birinin
valuekendi durumlarına işaret edecek şekilde yaptık. - Metin girişlerimize
onChangeTextişleyicisini ekledik. Bu, giriş alanlarından yeni bir değer girildiğinde veya silindiğinde tetiklenir. - İki argümanı kabul eden
onInputChangefonksiyonumuzu çağırdık:- Geçerli
value,onChangeTextişleyicisi tarafından sağlanır. - Güncellenmesi gereken durumun ayarlayıcısı (ilk giriş alanı için
setEmailve ikincisinisetPassword. - Son olarak
onInputChangefonksiyonumuzu yazıyoruz ve fonksiyonumuz tek bir şey yapıyor: İlgili durumları yeni değerle güncelliyor.
- Geçerli
Üzerinde çalışmamız gereken bir sonraki şey, form gönderme düğmesine her tıklandığında çağrılan onUserAuthentication() işlevidir.
İdeal olarak, kullanıcının zaten bir hesap oluşturmuş olması gerekir ve oturum açma, kullanıcının var olduğunu kontrol etmek ve ardından kullanıcıya bir simge atamak için bir tür arka uç mantığını içerecektir. Bizim durumumuzda, herhangi bir arka uç kullanmadığımız için, doğru kullanıcı oturum açma ayrıntısını tutan bir nesne oluşturacağız ve ardından yalnızca girilen değerler, gireceğimiz email ve password oturum açma nesnesindeki sabit değerlerimizle eşleştiğinde bir kullanıcının kimliğini doğrulayacağız. oluşturmak.
Bunu yapmak için ihtiyacımız olan kod:
... const correctAuthenticationDetails = { email: '[email protected]', password: 'password' } const WelcomeScreen = () => { ... // This function gets called when the `AUTHENTICATE` button is clicked const onUserAuthentication = () => { if ( email !== correctAuthenticationDetails.email || password !== correctAuthenticationDetails.password ) { alert('The email or password is incorrect') return } // In here, we will handle what happens if the login details are // correct } ... return ( ... ) } ... Yukarıdaki kodda ilk fark edeceğiniz şeylerden biri, WelcomeScreen() işlevsel bileşeninin dışında bir correctAuthenticationDetails (bir kullanıcının sağlamasını beklediğimiz doğru oturum açma ayrıntılarını tutan bir nesnedir) tanımlamış olmamızdır.
Ardından, onUserAuthentication() işlevinin içeriğini yazdık ve ilgili durumlarda tutulan email veya password nesnemizde sağladığımız parolayla eşleşmediğini kontrol etmek için koşullu bir ifade kullandık.
Şimdiye kadar neler yaptığımızı görmek istiyorsanız, WelcomeScreen bileşenini App.js'nize şu şekilde içe aktarın:
App.js dosyasını açın ve şunu koyun, kodun tamamını şununla değiştirin:
import { StatusBar } from 'expo-status-bar'; import React from 'react'; import { View } from 'react-native'; import WelcomeScreen from './views/screens/preAuthScreens/welcomeScreen'; export default function App() { return ( <View> <StatusBar /> <WelcomeScreen /> </View> ); } Yukarıdaki koda yakından baktığınızda, yaptığımızın WelcomeScreen bileşenini içe aktardığını ve ardından onu App() işlevinde kullandığımızı göreceksiniz.
WelcomeScreen sonucu şöyle görünür:
Artık WelcomeScreen bileşenini oluşturmayı bitirdiğimize göre, devam edelim ve küresel durumumuzu yönetmek için Context API ile çalışmaya başlayalım.
Neden Bağlam API'si?
Context API kullanarak, ReactJS'ye herhangi bir ek kitaplık yüklememize gerek yoktur, kurulumu daha az streslidir ve ReactJS'de küresel durumu ele almanın en popüler yollarından biridir. Hafif durum yönetimi için iyi bir seçimdir.
Bağlamımızı Yaratmak
Hatırlarsanız, daha önce bir bağlam klasörü oluşturmuştuk ve bunun içinde authContext adında bir alt klasör oluşturmuştuk.
Şimdi authContext klasöründeki AuthContext.js dosyasına gidelim ve bağlamımızı oluşturalım:
bağlam > authContext > AuthContext.js
import React, { createContext } from 'react'; const AuthContext = createContext(); export default AuthContext; Az önce oluşturduğumuz AuthContext , loading durumu değerini ve userToken durum değerlerini tutar. Şu anda, yukarıdaki kod bloğunda bildirdiğimiz createContext , burada herhangi bir varsayılan değer başlatmadık, bu nedenle bağlamımız şu anda undefined . Yetkilendirme bağlamının örnek bir değeri {loading: false, userToken: 'abcd} olabilir.
AuthState.js dosyası, Context API mantığımızı ve durum değerlerini içerir. Burada yazılan fonksiyonlar, uygulamamız içerisinde herhangi bir yerden çağrılabilir ve durum olarak değerleri güncellediklerinde global olarak da güncellenir.
İlk olarak, ihtiyacımız olacak tüm importları bu dosyaya getirelim:
bağlam > AuthContext > AuthState.js
import React, { useState } from 'react'; import AuthContext from './AuthContext'; import AsyncStorage from '@react-native-community/async-storage'; Durumlarımızı tutmak için useState() kancasını ReactJS'den içe aktardık, yukarıda oluşturduğumuz AuthContext dosyasını içe aktardık çünkü bu, kimlik doğrulama için boş bağlamımızın başlatıldığı ve daha sonra göreceğiniz gibi, ilerlememiz sırasında onu kullanmamız gerekecek. , son olarak AsyncStorage paketini içe aktarıyoruz (web için localStorage'a benzer).
AsyncStorage , verileri bir React Native uygulamasında cihaz üzerinden çevrimdışı olarak sürdürmenize olanak tanıyan bir React Native API'sidir.
... const AuthState = (props) => { const [userToken, setUserToken] = useState(null); const [isLoading, setIsLoading] = useState(true); const onAuthentication = async() => { const USER_TOKEN = "drix1123q2" await AsyncStorage.setItem('user-token', USER_TOKEN); setUserToken(USER_TOKEN); console.warn("user has been authenticated!") } return ( <AuthContext.Provider value={{ onAuthentication, }} > {props.children} </AuthContext.Provider> ) } export default AuthState;Yukarıdaki kod bloğunda yaptığımız şey:
userTokenveisLoadingiçin iki durum bildirdik.userTokendurumu,AsyncStoragekaydedilen belirteci depolamak için kullanılırkenisLoadingdurumu, yükleme durumunu izlemek için kullanılır (başlangıçtatrueolarak ayarlanır). İlerledikçe bu iki durumun kullanımı hakkında daha fazla şey öğreneceğiz.Daha sonra
onAuthentication()fonksiyonumuzu yazdık. Bu işlev,welcomeScreen.jsxdosyasından oturum açma düğmesine tıklandığında çağrılan bir zamanasyncişlevdir. Bu işlev yalnızca, kullanıcının sağladığı e-posta ve parola, sağladığımız doğru kullanıcı ayrıntısı nesnesiyle eşleşirse çağrılır. Genellikle kimlik doğrulama sırasında olan şey, kullanıcının JWT gibi bir paket kullanılarak arka uçta kimliği doğrulandıktan sonra kullanıcı için bir belirteç oluşturulması ve bu belirtecin ön uca gönderilmesidir. Bu eğitimde bunların hepsine girmeyeceğimiz için, statik bir belirteç oluşturduk ve onuUSER_TOKENadlı bir değişkende tuttuk.Ardından, kullanıcı belirtecimizi
user-tokenadıylaawaitayarlamak için wait anahtar sözcüğünü kullanırız.console.warn()ifadesi sadece her şeyin yolunda gittiğini kontrol etmek için kullanılır, istediğiniz zaman kaldırabilirsiniz.Son olarak,
onAuthenticatedişlevimizi<AuthContext.Provider>içinde bir değer olarak iletiyoruz, böylece uygulamamızdaki herhangi bir yerden işleve erişebilir ve onu çağırabiliriz.
ekranlar > ön Yetkilendirme > karşılamaScreen.js
İlk olarak, useContext ReactJS'den içe aktarın ve AuthContext AuthContext.js dosyasından içe aktarın.

import React, { useState, useContext } from 'react'; import AuthContext from '../../../context/authContext/AuthContext' ... Şimdi, welcomeScreen() işlevsel bileşeninin içinde, oluşturduğumuz bağlamı kullanalım:
... const WelcomeScreen = () => { const { onAuthentication } = useContext(AuthContext) const onUserAuthentication = () => { if ( email !== correctAuthenticationDetails.email || password !== correctAuthenticationDetails.password ) { alert('The email or password is incorrect') return } onAuthentication() } return ( ... ) } ... Yukarıdaki kod bloğunda, onAuthentication fonksiyonunun AuthContext ve sonra onu onUserAuthentication() fonksiyonumuzun içinde çağırdık ve daha önce orada olan console.log() deyimini kaldırdık.
Şu anda, AuthContext henüz erişimimiz olmadığı için bu bir hata verecektir. AuthContext uygulamanızın herhangi bir yerinde kullanmak için, uygulamamızdaki en üst düzey dosyayı AuthState ile AuthState (bizim durumumuzda bu App.js dosyasıdır).
App.js dosyasına gidin ve oradaki kodu şununla değiştirin:
import React from 'react'; import WelcomeScreen from './views/screens/preAuthScreens/welcomeScreen'; import AuthState from './context/authContext/AuthState' export default function App() { return ( <AuthState> <WelcomeScreen /> </AuthState> ); }Buraya kadar geldik ve bu bölümü bitirdik. Yönlendirmemizi kuracağımız sonraki bölüme geçmeden önce yeni bir ekran oluşturalım. Oluşturacağımız ekran HomeScreen.js dosyası olacak ve ancak başarılı bir doğrulamadan sonra görünmesi gerekiyor.
Şuraya gidin: ekranlar > postAuth .
HomeScreen.js adlı yeni bir dosya oluşturun. HomeScreen.js dosyasının kodu:
ekranlar > postAuth > HomeScreen.js
import React from 'react'; import { View, Text, Button, StyleSheet } from 'react-native'; const HomeScreen = () => { const onLogout = () => { console.warn("Logout button cliked") } return ( <View style={styles.container}> <Text>Now you're authenticated! Welcome!</Text> <Button title="LOG OUT" onPress={onLogout} /> </View> ) } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center', }, }) export default HomeScreen Şimdilik, çıkış düğmesinin boş bir console.log() ifadesi vardır. Daha sonra, çıkış fonksiyonunu oluşturacağız ve bağlamımızdan ekrana aktaracağız.
Rotalarımızı Ayarlamak
Navigasyon klasörümüzün içinde üç (3) dosya oluşturmamız gerekiyor:
- postAuthNavigator.js ,
- preAuthNavigator.js ,
- AppNavigator.js .
Bu üç dosyayı oluşturduktan sonra, az önce oluşturduğunuz preAuthNaviagtor.js dosyasına gidin ve şunu yazın:
navigasyon > preAuthNavigator.js
import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; import WelcomeScreen from "../screens/preAuthScreens/welcomeScreen"; const PreAuthNavigator = () => { const { Navigator, Screen } = createStackNavigator(); return ( <Navigator initialRouteName="Welcome"> <Screen name="Welcome" component={WelcomeScreen} /> </Navigator> ) } export default PreAuthNavigator;Yukarıdaki dosyada yaptığımız şey:
- Yığın navigasyonumuz için kullandığımız
@react-navigation/stackcreateStackNavigatoriçe aktardık.createStackNavigator, uygulamanızın her yeni ekranın bir yığının üzerine yerleştirildiği ekranlar arasında geçiş yapması için bir yol sağlar. Varsayılan olarak yığın gezgini, tanıdık iOS ve Android görünümüne ve hissine sahip olacak şekilde yapılandırılmıştır: iOS'ta yeni ekranlar sağdan kayar, Android'de alttan kaybolur. React Native'deki yığın gezgini hakkında daha fazla bilgi edinmek istiyorsanız buraya tıklayın. -
NavigatorveScreencreateStackNavigator()'dan bozduk. - Return
<Navigator/>ile navigasyonumuzu,<Screen/>ile ekranımızı oluşturduk. bu, kimlik doğrulamadan önce erişilebilen birden fazla ekranımız varsa, burada onları temsil eden birden çok<Screen/>etiketine sahip olacağımız anlamına gelir. - Son olarak,
PreAuthNavigatorbileşenimizi dışa aktarıyoruz.
Benzer bir şeyi postAuthNavigator.js dosyası için yapalım.
navigasyon > postAuthNavigator.js
import React from "react"; import { createStackNavigator } from "@react-navigation/stack"; import HomeScreen from "../screens/postAuthScreens/HomeScreen"; const PostAuthNavigator = () => { const { Navigator, Screen} = createStackNavigator(); return ( <Navigator initialRouteName="Home"> <Screen name="Home" component={HomeScreen} /> </Navigator> ) } export default PostAuthNavigator; Yukarıdaki kodda gördüğümüz gibi, preAuthNavigator.js ve postAuthNavigator.js arasındaki tek fark, oluşturulan ekrandır. HomeScreen WelcomeScreen'i alırken, WelcomeScreen HomeScreen'i alır.
AppNavigator.js'mizi oluşturmak için birkaç şey yaratmamız gerekiyor.
AppNavigator.js , kullanıcı tarafından erişim için hangi rotanın mevcut olacağını değiştireceğimiz ve kontrol edeceğimiz yer olduğundan, bunun düzgün çalışması için birkaç ekrana ihtiyacımız var, önce oluşturmamız gereken şeyleri özetleyelim:
- TransitionScreen.js
Uygulama hangi navigasyona bağlanacağına karar verirken, bir geçiş ekranının görünmesini istiyoruz. Tipik olarak, geçiş ekranı bir yükleme döndürücü veya uygulama için seçilen diğer herhangi bir özel animasyon olacaktır, ancak bizim durumumuzda, yüklemeyi görüntülemek için temel bir<Text/>etiketi kullanacağızloading…. -
checkAuthenticationStatus()
Bu fonksiyon, hangi navigasyon yığınının monte edileceğini belirleyecek olan kimlik doğrulama durumunu kontrol etmek için çağıracağımız fonksiyondur. Bu işlevi bağlamımızda oluşturacağız ve Appnavigator.js içinde kullanacağız.
Şimdi devam edelim ve TransitionScreen.js dosyamızı oluşturalım.
ekranlar > TransitionScreen.js
import React from 'react'; import { Text, View } from 'react-native'; const TransitionScreen = () => { return ( <View> <Text>Loading...</Text> </View> ) } export default TransitionScreenGeçiş ekranımız, yükleme metnini gösteren basit bir ekrandır. Bu yazıda ilerledikçe bunu nerede kullanacağımızı göreceğiz.
Ardından, AuthState.js'mize gidelim ve checkAuthenticationStatus() :
bağlam > authContext > AuthState.js
import React, { useState, useEffect } from 'react'; import AuthContext from './AuthContext'; import AsyncStorage from '@react-native-community/async-storage'; const AuthState = (props) => { const [userToken, setUserToken] = useState(null); const [isLoading, setIsLoading] = useState(true); ... useEffect(() => { checkAuthenticationStatus() }, []) const checkAuthenticationStatus = async () => { try { const returnedToken = await AsyncStorage.getItem('user-toke n'); setUserToken(returnedToken); console.warn('User token set to the state value) } catch(err){ console.warn(`Here's the error that occured while retrievin g token: ${err}`) } setIsLoading(false) } const onAuthentication = async() => { ... } return ( <AuthContext.Provider value={{ onAuthentication, userToken, isLoading, }} > {props.children} </AuthContext.Provider> ) } export default AuthState; Yukarıdaki kod bloğunda checkAuthenticationStatus() fonksiyonunu yazdık. Fonksiyonumuzda, yaptığımız şey şu:
-
AsyncStorageawaitiçin wait anahtar sözcüğünü kullandık.AsyncStorageile sağlanan belirteç yoksa,nulldeğerini döndürür. İlkuserTokendanullolarak ayarlandı. -
setUserTokendöndürülen değerimizi yeniAsyncStorageolarak ayarlamak içinuserToken. Döndürülen değernullise, bu,userTokennullkaldığı anlamına gelir. -
try{}…catch(){}bloğundan sonra, kimlik doğrulama durumunu kontrol etme işlevi tamamlandığındanisLoadingfalse olarak ayarladık.TransitionScreenhala görüntüleyip görüntülemeyeceğimizi bilmek içinisLoadingdeğerine ihtiyacımız olacak. Hatayla karşılaşıldığında kullanıcıya "Yeniden Dene" veya "Yeniden Dene" düğmesini gösterebilmemiz için jeton alınırken bir hata varsa bir hata ayarlamayı düşünmeye değer. -
AuthState, kimlik doğrulama durumunu kontrol etmek isteriz, bu yüzden bunu yapmak içinuseEffect()ReactJS kancasını kullanırız.useEffect()checkAuthenticationStatus()isLoadingdeğerinifalseolarak ayarlıyoruz. - Son olarak, Context API kapsamındaki uygulamamızın herhangi bir yerinden erişebilmemiz için durumlarımızı
<AuthContext.Provider/>değerlerimize ekleriz.
Artık fonksiyonumuza kavuştuğumuza göre, AppNavigator.js'ye geri dönme ve kimlik doğrulama durumuna göre belirli bir yığın gezgini kurmak için kodu yazma zamanı:
navigasyon > AppNavigator.js
İlk olarak, AppNavigator.js için ihtiyacımız olan her şeyi içe aktaracağız.
import React, { useEffect, useContext } from "react"; import PreAuthNavigator from "./preAuthNavigator"; import PostAuthNavigator from "./postAuthNavigator"; import { NavigationContainer } from "@react-navigation/native" import { createStackNavigator } from "@react-navigation/stack"; import AuthContext from "../../context/authContext/AuthContext"; import TransitionScreen from "../screens/TransitionScreen"; Artık tüm içe aktarmalarımız olduğuna göre, AppNavigator() işlevini oluşturalım.
... const AppNavigator = () => { } export default AppNavigator Ardından, AppNavigator() fonksiyonumuzun içeriğini yazmaya devam edeceğiz:
import React, { useState, useEffect, useContext } from "react"; import PreAuthNavigator from "./preAuthNavigator"; import PostAuthNavigator from "./postAuthNavigator"; import { NavigationContainer } from "@react-navigation/native" import { createStackNavigator } from "@react-navigation/stack"; import AuthContext from "../../context/authContext/AuthContext"; import TransitionScreen from "../screens/transition"; const AppNavigator = () => { const { Navigator, Screen } = createStackNavigator(); const authContext = useContext(AuthContext); const { userToken, isLoading } = authContext; if(isLoading) { return <TransitionScreen /> } return ( <NavigationContainer> <Navigator> { userToken == null ? ( <Screen name="PreAuth" component={PreAuthNavigator} options={{ header: () => null }} /> ) : ( <Screen name="PostAuth" component={PostAuthNavigator} options={{ header: () => null }} /> ) } </Navigator> </NavigationContainer> ) } export default AppNavigatorYukarıdaki kod bloğunda, yaptığımız şeyin bir taslağı var:
- Bir yığın gezgini oluşturduk ve
NavigatorveScreenondan bozduk. - UserToken ve
isLoadinguserTokeniçeAuthContext -
AuthState, buradakiuseEffecctkancasındacheckAuthenticationStatus()çağrılır.ifdeyiminiisLoadingtrueolup olmadığını kontrol etmek için kullanırız, eğertrueise geri döndüğümüz ekran,checkAuthenticationStatus()işlevi henüz tamamlanmadığı için daha önce oluşturduğumuz<TransitionScreen />ekranımızdır. -
checkAuthenticationStatus()tamamlandıktan sonraisLoadingfalseolarak ayarlanır ve ana Navigasyon bileşenlerimizi döndürürüz. -
NavigationContainer,@react-navigation/nativeiçe aktarıldı. Ana üst düzey gezginde yalnızca bir kez kullanılır. Bunu preAuthNavigator.js'de veya postAuthNavigator.js'de kullanmadığımıza dikkat edin . -
AppNavigator()'da hala bir yığın gezgini oluşturuyoruz. ContextPreAuthNavigatoralınanuserTokennullise, değeri başka bir şeyse (yaniAsyncStorage.getItem()içindekicheckAuthenticationStatus()gerçek bir değer döndürdüğü) PreAuthNavigator öğesini bağlarız, sonraPostAuthNavigatoröğesini bağlarız. Koşullu oluşturma işlemimiz üçlü operatör kullanılarak yapılır.
Şimdi AppNavigator.js dosyamızı kurduk . Ardından, AppNavigator App.js dosyamıza geçirmemiz gerekiyor.
AppNavigator App.js dosyasına aktaralım:
App.js
... import AppNavigator from './views/navigation/AppNavigator'; ... return ( <AuthState> <AppNavigator /> </AuthState> );Şimdi uygulamamızın şu anda nasıl göründüğüne bakalım:
Oturum açmaya çalışırken yanlış bir kimlik bilgisi girdiğinizde şunlar olur:
Oturum Kapatma İşlevini Ekleme
Bu noktada kimlik doğrulama ve rota seçim sürecimiz tamamlanmıştır. Uygulamamız için geriye kalan tek şey, oturum kapatma işlevini eklemektir.
Çıkış düğmesi HomeScreen.js dosyasındadır. Düğmenin onPress niteliğine bir onLogout() işlevi ilettik. Şimdilik fonksiyonumuzda basit bir console.log() deyimi var, ancak kısa bir süre sonra bu değişecek.
Şimdi AuthState.js'mize gidelim ve çıkış için fonksiyonu yazalım. Bu işlev, kullanıcı belirtecinin kaydedildiği AsyncStorage temizler.
bağlam > authContext > AuthState.js
... const AuthState = (props) => { ... const userSignout = async() => { await AsyncStorage.removeItem('user-token'); setUserToken(null); } return ( ... ) } export default AuthState; userSignout() , user-token AsyncStorage kaldıran eşzamansız bir işlevdir.
Şimdi, çıkış düğmesine her tıklandığında HomeScreen.js'deki userSignout() işlevini çağırmamız gerekiyor.
HomeScreen.js'mize gidelim ve userSignout() ' AuthContext .
ekranlar > postAuthScreens > HomeScreen.js
import React, { useContext } from 'react'; import { View, Text, Button, StyleSheet } from 'react-native'; import AuthContext from '../../../context/authContext/AuthContext' const HomeScreen = () => { const { userSignout } = useContext(AuthContext) const onLogout = () => { userSignout() } return ( <View style={styles.container}> <Text>Now you're authenticated! Welcome!</Text> <Button title="LOG OUT" onPress={onLogout} /> </View> ) } ... Yukarıdaki kod bloğunda, ReactJS'den useContext kancasını içe aktardık, ardından AuthContext'imizi içe aktardık. Ardından, userSignout işlevinin AuthContext ve bu userSignout() onLogout() çağrılır.
Artık çıkış düğmemiz her tıklandığında, AsyncStorage kullanıcı belirteci temizleniyor.
işte! tüm sürecimiz bitti.
Giriş yaptıktan sonra geri düğmesine bastığınızda şunlar olur:
Oturumu kapattıktan sonra geri düğmesine bastığınızda şunlar olur:
Gezinme yığını değiştirme işlemimizde bu kalıbı kullanırken fark ettiğimiz bazı farklı davranışlar şunlardır:
- Oturum açtıktan sonra başka bir rotaya gitmek için
navigation.navigate()veyanavigation.push()kullanmamız gereken hiçbir yer olmadığını fark edeceksiniz. Durumumuz kullanıcı belirteci ile güncellendiğinde, oluşturulan gezinme yığını otomatik olarak değiştirilir. - Giriş başarılı olduktan sonra cihazınızdaki geri düğmesine basmak sizi giriş sayfasına geri götürmez, bunun yerine uygulamayı tamamen kapatır. Bu davranış önemlidir, çünkü kullanıcının uygulamadan çıkış yapması dışında oturum açma sayfasına geri dönmesini istemezsiniz. Aynı şey oturumu kapatmak için de geçerlidir - kullanıcı oturumu
HomeScreensonra Ana Ekran ekranına dönmek için geri düğmesini kullanamaz, bunun yerine uygulama kapanır.
Çözüm
Pek çok Uygulamada, kimlik doğrulama en önemli kısımlardan biridir çünkü korunan içeriğe erişmeye çalışan kişinin bilgiye erişim hakkına sahip olduğunu onaylar. Nasıl doğru yapılacağını öğrenmek, harika, sezgisel ve kullanımı/uygulamada gezinmeyi kolaylaştırmak için önemli bir adımdır.
Bu kodu temel alarak, eklemeyi düşünebileceğiniz birkaç şey şunlardır:
- Giriş alanlarını doğrulamak için form doğrulama. Formik ve Yup ile React Native form doğrulamasını kontrol edin.
- Kimlik doğrulamayı Gmail, Github, Facebook, Twitter veya özel arayüzünüzle entegre etmek için Firebase kimlik doğrulaması. React Native Firebase'e göz atın.
- Tasarımcılar için kod kavramları: Doğrulama ve Yetkilendirme.
Kimlik doğrulama, güvenlik ve bunu nasıl doğru yapacağınız konusunda sizi daha fazla aydınlatacak bulduğum bazı önemli kaynaklar da burada:
Kaynaklar
- React Native: Kullanıcı Doğrulama Akışı Açıklaması
- 10 React Security En İyi Uygulamaları
- Sonraki İhlali Önleyebilecek Kimlik Doğrulama Yöntemleri
- Uygulamamızın canlı derlemesini/önizlemesini buradan görüntüleyin;
- Projeyi GitHub'da görüntüleyin.
