#reactjs #authentication #react-router-dom
Вопрос:
Я создал Login
компонент, который перенаправляет меня обратно Login
после успешной аутентификации. Вместо этого он должен перенаправляться на частный маршрут по адресу "/"
. handleSubmit
Функция в моем Login
компоненте выглядит следующим образом:
function handleSubmit(e) {
setLoading(true);
e.preventDefault();
authenticationService.login(email, password)
.then((res) => {
console.log(res.data);
setLoading(false);
history.push("/");
console.log(authenticationService.isAuthenticated);
})
.catch((error) => {
console.log(error);
setLoading(false);
setError(error.message || error);
});
}
Я вижу , что console.log(authenticationService.isAuthenticated)
это false
так, поэтому причину, по которой я перенаправляюсь Login
при history.push("/")
запуске, можно найти в PrivateRoute
— Я еще не аутентифицирован, поэтому он отправляет сообщение обратно Login
:
import { Redirect, Route } from "react-router";
import { authenticationService } from "./services";
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={(props) => {
if (authenticationService.isAuthenticated) {
return <Component {...props} />;
}
return <Redirect to="/login" />;
}}
/>
);
export default PrivateRoute;
Мой вопрос заключается в следующем: каков рекомендуемый способ решения этой проблемы. Поскольку это, безусловно, чрезвычайно частый случай использования, я думаю, что существует стандартная процедура, позволяющая сделать эту работу правильной.
В случае, если это полезно, я authenticationService.login
выгляжу следующим образом:
// authentication.service.js
import axios from "axios";
import { api } from "../api";
const authAxios = axios.create();
authAxios.interceptors.request.use((config) => {
const newConfig = config;
const token = localStorage.getItem("token");
console.log(token);
newConfig.headers = {
Authorization: `Token ${token}`,
};
return newConfig;
});
function isAuthenticated() {
const token = localStorage.getItem("token");
return token !== null amp;amp; token !== undefined;
}
function login(email, password) {
return axios
.post(api.auth.login, {
email,
password,
})
.then((res) => {
localStorage.setItem("token", res.data.key);
return res;
});
}
function logout() {
localStorage.removeItem("token");
}
const authenticationService = {
isAuthenticated: isAuthenticated(),
login,
logout,
};
export { authAxios, authenticationService };
Комментарии:
1. Что такое
authenticationService
? Можете ли вы показать его полный код?2. @Tom Я включил свой
authentication.service.js
файл — дайте мне знать, если вам понадобится что-нибудь еще, что может быть вам полезно.