Нужна какая-то идея для реализации asyn c хранилища в приложении React Native, чтобы пользователь оставался в приложении - PullRequest
1 голос
/ 19 февраля 2020

соответствующее сообщество разработчиков StackOverflow. Я новичок, чтобы реагировать на нативную разработку около месяца. go Я начинаю изучать и внедрять приложение на реагировать на нативную, сейчас я застрял в асин c хранилище. На самом деле я использую php веб-сервис для входа пользователя в мое приложение mysql это база данных, которую я использую. Теперь я хочу, чтобы пользователь входил в мое приложение, как если бы пользователь вошел в систему успешно, а затем, если пользователь закроет приложение, приложение сохранит его имя пользователя и пароль, и в следующий раз, когда пользователь откроет приложение, ему не нужно будет снова входить. приложение прямо показывает его домашний экран я читаю асин c хранилище отвечает за такую ​​работу нужна помощь для реализации такого рода функций я следую этому руководству для входа в систему: https://reactnativecode.com/react-native-user-login-using-php-mysql/

import React, { Component } from 'react';
 
import { StyleSheet, TextInput, View, Alert, Button, Text , AsyncStorage} from 'react-native';

// Importing Stack Navigator library to add multiple activities.
import { createStackNavigator , createAppContainer } from 'react-navigation';
 
// Creating Login Activity.
class LoginActivity extends Component {

  // Setting up Login Activity title.
  static navigationOptions =
   {
      title: 'LoginActivity',
   };
 
constructor(props) {
 
    super(props)
 
    this.state = {
 
      UserEmail: '',
      UserPassword: ''
 
    }
 
  }

UserLoginFunction = () =>{
 const { UserEmail }  = this.state ;
 const { UserPassword }  = this.state ;
 
 
fetch('http://192.168.0.107/loginrn/User_Login.php', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
 
    email: UserEmail,
 
    password: UserPassword
    //console.log('UserEmail')
  })
 
}).then((response) => response.json())
      .then((responseJson) => {

        // If server response message same as Data Matched
       if(responseJson === 'Data Matched')
        {

            //Then open Profile activity and send user email to profile activity.
            this.props.navigation.navigate('Second', { Email: UserEmail });

        }
        else{

          Alert.alert(responseJson);
        }

      }).catch((error) => {
        console.error(error);
      });
          
      
 
  }
 
  render() {
    return (
 
<View style={styles.MainContainer}>
 
        <Text style= {styles.TextComponentStyle}>User Login Form</Text>
  
        <TextInput
          
          // Adding hint in Text Input using Place holder.
          placeholder="Enter User Email"
 
          onChangeText={UserEmail => this.setState({UserEmail})}
 
          // Making the Under line Transparent.
          underlineColorAndroid='transparent'
 
          style={styles.TextInputStyleClass}
        />
 
        <TextInput
          
          // Adding hint in Text Input using Place holder.
          placeholder="Enter User Password"
 
          onChangeText={UserPassword => this.setState({UserPassword})}
 
          // Making the Under line Transparent.
          underlineColorAndroid='transparent'
 
          style={styles.TextInputStyleClass}
 
          secureTextEntry={true}
        />
 
        <Button title="Click Here To Login" onPress={this.UserLoginFunction} color="#2196F3" />
      
  
 
</View>
            
    );
  }
}
// Creating Profile activity.
class ProfileActivity extends Component
{

  // Setting up profile activity title.
   static navigationOptions =
   {
      title: 'ProfileActivity',
    
   };
    

   render()
   {

     const {goBack} = this.props.navigation;

      return(
         <View style = { styles.MainContainer }>
 
            <Text style = {styles.TextComponentStyle}> { this.props.navigation.state.params.Email } </Text>

            <Button title="Click here to Logout" onPress={ () => goBack(null) } />
 
         </View>
      );
   }
}

const AppNavigator= createStackNavigator(
{
   First: { screen: LoginActivity },
   
   Second: { screen: ProfileActivity }

});
export default createAppContainer(AppNavigator);

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Не очень безопасно хранить учетные данные локально. Вам следует рассмотреть возможность реализации аутентификации на основе токенов, например: https://auth0.com/blog/adding-authentication-to-react-native-using-jwt/

Каждый раз, когда пользователь выполняет что-то, требующее аутентификации, вы должны передать свой токен в качестве заголовка авторизации и проверить его на на стороне сервера. Документация показывает, как это реализовать. Это просто и реально.

1 голос
/ 19 февраля 2020

Добро пожаловать в Stackoverflow:) ...

Прежде всего, если вы новичок в React Native, следуйте всем необходимым документам здесь

В любом случае, как начинающий ваш код в порядке .. но дело в React Native, как вы знаете, мы реализуем классы для каждого компонента / экрана / функции. В вашем коде, где вы пытаетесь сделать все функции приложения в одной базе кода в одном файле. Это не лучшая практика. Изучите React Native с лучшими практиками. :)

Давайте теперь перейдем к вашему вопросу

В вашем сценарии просто необходимо добавить React Native Local Storage - AsyncStorage для поддержки пользователя сеансы легко. Как только пользователь успешно вошел в систему, вам нужно сделать некоторую постоянную переменную на устройстве пользователя, которую мы сможем проверить, как только мы запустим приложение - это простой сценарий.

Давайте сделаем кодирование сейчас

Прежде всего, вам нужно установить AsyncStorage, который предоставляется @ реагировать-родным-сообществом

  • Если вы используете пряжу, запустите эту yarn add @react-native-community/async-storage или если вы используя npm, запустите npm i -s @react-native-community/async-storage

  • Если вы используете React Native Version 0.60 или выше, вам не нужно связывать npm пакеты вручную:)

  • Если вы работаете на android, вы можете работать в обычном режиме, но вы работаете на iOS, вам нужно выполнить установку pod

    • cd ios && pod install
  • Теперь импортируйте AsyncStorage, используя

    • import AsyncStorage from '@react-native-community/async-storage';
  • После этого необходимо сохранить электронная почта пользователя после успешного входа в систему

    • AsyncStorage.setItem('userEmail', JSON.stringify(UserEmail));
  • Теперь вы можете проверить журнал i c - если в локальном хранилище есть электронная почта пользователя, то пользователь регистрируется

  • Но здесь необходимо очистить локальное хранилище, когда пользователь нажал кнопку выхода из системы, используя AsyncStorage.clear()

ФИНАЛЬНЫЙ КОД

import React, { Component } from "react";

import {
  StyleSheet,
  TextInput,
  View,
  Alert,
  Button,
  Text,
  AsyncStorage
} from "react-native";

// Importing Stack Navigator library to add multiple activities.
import { createStackNavigator, createAppContainer } from "react-navigation";

//Import Async Storage - Local Storage
import AsyncStorage from "@react-native-community/async-storage";

// Creating Login Activity.
class LoginActivity extends Component {
  // Setting up Login Activity title.
  static navigationOptions = {
    title: "LoginActivity"
  };

  constructor(props) {
    super(props);

    this.state = {
      UserEmail: "",
      UserPassword: ""
    };
  }

  //Check If the user is already logged or not
  componentDidMount() {
    //Get User Email From Local Storage
    AsyncStorage.getItem("userEmail").then(data => {
      if (data) {
        //If userEmail has data -> email
        this.props.navigation.navigate("Second", { Email: JSON.parse(data) }); //Navigate to Second Screen
      }
    });
  }

  UserLoginFunction = () => {
    const { UserEmail } = this.state;
    const { UserPassword } = this.state;

    fetch("http://192.168.0.107/loginrn/User_Login.php", {
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        email: UserEmail,

        password: UserPassword
        //console.log('UserEmail')
      })
    })
      .then(response => response.json())
      .then(responseJson => {
        // If server response message same as Data Matched
        if (responseJson === "Data Matched") {
          //Save User Details to Local Storage
          AsyncStorage.setItem("userEmail", JSON.stringify(UserEmail));
          //Then open Profile activity and send user email to profile activity.
          this.props.navigation.navigate("Second", { Email: UserEmail });
        } else {
          Alert.alert(responseJson);
        }
      })
      .catch(error => {
        console.error(error);
      });
  };

  render() {
    return (
      <View style={styles.MainContainer}>
        <Text style={styles.TextComponentStyle}>User Login Form</Text>

        <TextInput
          // Adding hint in Text Input using Place holder.
          placeholder="Enter User Email"
          onChangeText={UserEmail => this.setState({ UserEmail })}
          // Making the Under line Transparent.
          underlineColorAndroid="transparent"
          style={styles.TextInputStyleClass}
        />

        <TextInput
          // Adding hint in Text Input using Place holder.
          placeholder="Enter User Password"
          onChangeText={UserPassword => this.setState({ UserPassword })}
          // Making the Under line Transparent.
          underlineColorAndroid="transparent"
          style={styles.TextInputStyleClass}
          secureTextEntry={true}
        />

        <Button
          title="Click Here To Login"
          onPress={this.UserLoginFunction}
          color="#2196F3"
        />
      </View>
    );
  }
}
// Creating Profile activity.
class ProfileActivity extends Component {
  // Setting up profile activity title.
  static navigationOptions = {
    title: "ProfileActivity"
  };

  //logout button click
  logOutAction = () => {
    const { goBack } = this.props.navigation;
    AsyncStorage.clear(); // Clear the Async Storage Before Log out
    goBack(null);
  };

  render() {
    const { goBack } = this.props.navigation;

    return (
      <View style={styles.MainContainer}>
        <Text style={styles.TextComponentStyle}>
          {" "}
          {this.props.navigation.state.params.Email}{" "}
        </Text>

        <Button
          title="Click here to Logout"
          onPress={() => this.logOutAction()}
        />
      </View>
    );
  }
}

const AppNavigator = createStackNavigator({
  First: { screen: LoginActivity },

  Second: { screen: ProfileActivity }
});
export default createAppContainer(AppNavigator);

Если у вас есть какие-либо сомнения, не стесняйтесь спрашивать :) Happy Coding:)

...