Raect js: Все еще вошел в систему, несмотря на неправильные учетные данные и несанкционированный статус в консоли

#ruby-on-rails #reactjs #react-native #validation #authentication

Вопрос:

Студент здесь, и мне нужна помощь с проектом react frontend и rail backend. Я не знаю почему, но, несмотря на то, что я ввел неправильные учетные данные в свой логин, я все еще вошел в систему, хотя моя консоль говорит, что это неавторизованно. Любая помощь была бы очень признательна.

Поэтому, когда я пытаюсь намеренно ввести неверную информацию для входа, чтобы увидеть, отображаются ли ошибки, вместо того, чтобы по-прежнему видеть форму входа, я перенаправляюсь на домашнюю страницу, где пользователь может просматривать свои сохраненные книги, и я каким-то образом вошел в систему.

Я перепробовал все, чему нас учили в школе, чтобы исправить это, но это все еще не работает. Любая помощь вообще ценится, возможно, может помочь другой набор глаз.

 APP JS
import { BrowserRouter as Router, Route, Switch, useHistory } from 'react-router-dom' 
import React, { useState, useEffect } from 'react';
import './App.css';
import Home from './containers/Home'
import NavBar from './components/Navbar'
import Signup from './components/Signup';
import Login from './components/Login';
import Books from './containers/Books';
import Book from './containers/Book';


function App(props) {
  const [loggedIn, setLoggedIn] = useState(false)
  const [user, setUser] = useState({})
  const history = useHistory()

// in order to keep user
  useEffect(() => {
    fetch('/me')
    .then(res => { if (res.ok) { res.json() 
        .then(user => {
          setLoggedIn(true)
          setUser(user)
        })
      }
    })
  }, [])

  // Keep user logged in even if page refreshes
  const userLogin = (user) => {
    setLoggedIn(true)
    setUser(user)
    history.push('/')
  }

// Log out user and set logged in to false, reset set user as well
  const userLogout = () => {
    fetch('/logout', { method: 'DELETE' })
    .then(() => {
      setLoggedIn(false)
      setUser({})
    })
    history.push('/')
  }

  return (
    <div className="App">
      <NavBar user={user} loggedIn={loggedIn} userLogout={userLogout}/>
      <Switch>
        <Route exact path='/' 
        render={routerProps => 
        <Home {...routerProps} 
        user={user} 
        loggedIn={loggedIn} 
        userLogout={userLogout}/>}/>

        <Route exact path='/signup'  
        render={routerProps => 
        <Signup {...routerProps} 
        userLogin={userLogin} 
        setLoggedIn={setLoggedIn}/>}/>

        <Route exact path='/login'  
        render={routerProps => 
        <Login {...routerProps} 
        userLogin={userLogin}
        setLoggedIn={setLoggedIn} />}/>
        
        <Route exact path='/books'  
        render={routerProps => 
        <Books {...routerProps} 
        user={user} 
        loggedIn={loggedIn} />}/>

        <Route path='/books/:id'  
        render={routerProps => 
        <Book {...routerProps} 
        user={user} 
        loggedIn={loggedIn} 
        userLogin={userLogin}/>}/>
      </Switch>
      
    </div>
  );
}

export default App;

 
 LOGIN.JS
import React, { useState, } from 'react'
import { useHistory } from 'react-router-dom' 


const Login = ({userLogin, setLoggedIn}) => {
    const [username, setUsername] = useState('')
    const [password, setPassword] = useState('')
    const [errors, setErrors] = useState([])
    const [invaildLogin, setInvalidLogin] = useState(false)
    const history = useHistory()

    const handleSubmit = (e) => {
        // prevents a sending of a post request on submit
        e.preventDefault()
        fetch('/login', {
            method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({
            username: username,
            password: password
        })})
        .then(res => res.json())
        .then(response => {
            console.log(response)
            if (response.error) {
                setLoggedIn(false)
                setErrors(response.error)
                setInvalidLogin(true)
                
            } else {
                userLogin(response)
                
            }
        })
    }

    if (setLoggedIn === false) {
        history.push('/login')
    } else {
        if (setLoggedIn === true) {
            history.push('/') 
        }
    }

    return (
        <div className='login-container'>
            <h1>LOGIN BELOW:</h1>
            <form onSubmit={handleSubmit}>
                <label>Username:</label>
                <input type='text' id='username' value={username} onChange={(e) => setUsername(e.target.value)}/>
                <br/><br/>
                <label>Password:</label>
                <input type='password' id='password' value={password} onChange={(e) => setPassword(e.target.value)}/>
                <br/><br/>
                <input type='submit' />
                <div>
                    {invaildLogin ? <p className="error"> {errors[0]}</p> : <p> </p>}
                </div>
            </form>
        </div>
    )
}
export default Login
 

Комментарии:

1. Я бы сохранил состояние входа в систему в локальном хранилище, а не в состоянии реакции. Таким образом, вы можете получить доступ и настроить его из любого компонента. Я предполагаю, что где-то в вашем коде состояние входа в систему устанавливается равным true, вероятно, эффект использования в App.js. Проверьте, возвращает ли конечная точка /me данные, даже если они не аутентифицированы