Используя API, который уже был создан, когда пользователь заходит на страницу входа, он может выбрать вход в систему или просто изменить URL-адрес с локального хоста 3000 на / dashboard, и он не перенаправляется обратно на страницу входа. Он должен быть доступен пользователю только при условии ввода имени пользователя и пароля. Попытка изменить код несколько раз, и даже рядовые пользователи, но все еще не могут заставить его не получить доступ к странице. Перезапущен снова с предыдущим кодом в попытке выяснить его, хотя я уверен, что я смотрю на ответ
Это сочетание Login.js, а затем в конце его PrivateRoute.js
import axiosWithAuth from '../data/axiosWithAuth';
const Login = props => {
const [loginCreds, setLoginCreds] = useState({
username: "",
password: "",
err: null
});
const handleChange = e => {
setLoginCreds({
...loginCreds,
[e.target.name]: e.target.value,
err: null
});
};
const login = () => {
const proxy = "https://cors-anywhere.herokuapp.com/";
const url = "https://pintreachbackend.herokuapp.com/api/auth/login";
axiosWithAuth()
.post(proxy +url , {
username: loginCreds.username,
password: loginCreds.password
})
.then(res => {
localStorage.setItem("token", res.data.token);
props.history.push("/dashboard");
console.log(login)
})
.catch(err =>
setLoginCreds({
...loginCreds,
err: "Error logging in. Please try again."
})
);
};
const handleSubmit = e => {
e.preventDefault();
loginCreds.username === "" || loginCreds.password === ""
? setLoginCreds({
...loginCreds,
err: "Please complete all login fields."
})
: login();
};
return (
<div className="login-page">
<form>
<h4>Enter Login Creds</h4>
<input
type="text"
name="username"
placeholder="Enter username..."
value={loginCreds.username}
onChange={handleChange}
autoComplete="username"
/>
<input
type="password"
name="password"
placeholder="Enter password..."
value={loginCreds.password}
onChange={handleChange}
autoComplete="current-password"
/>
<button onClick={handleSubmit}>Login</button>
{loginCreds.err && (
<div className="error-container">{loginCreds.err}</div>
)}
</form>
</div>
);
};
export default Login; ~~~
This is the PrivateRoute.js
~~~import React from "react";
import { Route, Redirect } from "react-router-dom";
import axiosWithAuth from "../data/axiosWithAuth";
/*
Private Route rules:
1. It has the same API as <Route />.
2. It renders a <Route /> and passes all the props through to it.
3. It checks if the user is authenticated, if they are, it renders the
“component” prop. If not, it redirects the user to /login.
*/
const PrivateRoute = ({ component: Component, ...rest }) => {
// const Component = props.component
return (
<Route
{...rest}
render={props =>
axiosWithAuth ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: '/login', state: { from: props.location }
}}
/>
)
}
/>
)
}
export default PrivateRoute