@Anna_Belikova01

React +PHP+SQL=Авторизация?

Добрый день!
Я решила пощупать Реакт и PHP и объединить их вместе в одном проекте (нужно для учебы и работы). Встряла на вопросе авторизации, не могу понять, с какой стороны зайти. На PHP написала скрипт, который ищет пользователя в базе данных (SQL) авторизует пользователя. По задумке кнопка войти(по которой всплывает форма авторизации) для авторизованного пользователя должна заменится на его имя. PHP отрабатывает, но информация о состоянии(имя) не сохраняется в React.
Подскажите, пожалуйста, как это лучше хранить информацию об авторизовавшемся пользователе в самом Реакте?
Код php:
<?php 
	
	
	class userAuth {
		public $user_login = 'Guest';
		public $access = '';
		public $email = '';
	}
	
	$user_non = new userAuth;
	$user_sess=new userAuth;
	
	session_start();
	
	$database_host='localhost';
    $database_user='db';
    $database_password='password';
    $database_name='db';
	$connect = mysqli_connect($database_host, $database_user, $database_password, $database_name);
    
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST') 
	{
	
		if (empty($_POST['username'])) 
		{
			echo 'Вы не ввели логин';
		}
		elseif (empty($_POST['password'])) 
		{
			echo 'Вы не ввели пароль';
		}
		else 
		{    
			$login = $_POST['username'];
			$password = md5($_POST['password']);
			$user = mysqli_query($connect, "SELECT * FROM `add_users` WHERE `user_login` = '$login' AND `user_password` = '$password'");
			$sess_user = mysqli_fetch_array($user);
					
			if (empty($sess_user['id'])) 
			{
				echo 'Введенные данные не верны';
			}
			else 
			{
				$_SESSION['password'] = $password; 
				$_SESSION['username'] = $login; 
				$_SESSION['id'] = $sess_user['id'];
				$_SESSION['access'] = $sess_user['access'];
				$_SESSION['email'] = $sess_user['user_email']; 				
								
				
				$user_sess->user_login=$_SESSION['username'];
				$user_sess->access=$_SESSION['access'];
				$user_sess->email=$_SESSION['email'];
				
				echo json_encode($user_sess);
				
			}     
		}
}else{
	echo json_encode($user_non);
}
;?>


И код компонента Header :
import React, {Component} from 'react';
import { Navbar, NavbarBrand, Nav, NavbarToggler, Collapse, NavItem, Jumbotron, Button, Modal, ModalHeader, ModalBody, Form, FormGroup, Input, Label } from 'reactstrap';
import { NavLink } from 'react-router-dom';
import axios from "axios";

class Header extends Component {
    constructor(props) {
        super(props);
        this.state = {
 
            user:{
                user_login:"Guest",
                access:"",
                email:""
            }
        };
  
    }
    
   componentDidMount() {
       
        axios
            .get("http://site.ru/auth.php")
              .then(({ data }) => {
            console.log(data);
                this.setState({
                user:data
                });

        });     
       
   }

    render() {
        return ( 
            <div>
            <Navbar dark expand = "md" >
                                <NavItem >
                                    <Button className={(this.state.user.user_login == 'Guest' ? '' : 'hidden')} variant="outlined" color="primary"  onClick = {this.toggleModalLogin } > < span className = "fa fa-sign-in fa-lg" > < /span> Войти</Button >
                                    <NavLink className ={"nav-link"+(this.state.user.user_login == 'Guest' ? 'hidden' : '')} to = '/admin' > < span className = "fa fa-user fa-lg" > < /span> 
                                           <span > {this.state.user.user_login} </span>
                                    </NavLink >
                                </NavItem> 
            </Navbar> 
)};

export default Header;
  • Вопрос задан
  • 979 просмотров
Пригласить эксперта
Ответы на вопрос 1
@iordania
Вариант создать middleware которая будет проверять по токену, создать приватный компонент (!isAuth ? <Component_1 /> : <Component_2 />) и далее смотреть если токен success то рендерить то что вам нужно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы