@ghrtghrtq

Как можно сделать проверку наличия токена в localStorage на этапе роутинга?

Я делаю регистрацию в моем приложении. Когда пользователь успешно прошел валидацию и отправил форму на сервер токен сохраняется в localStorage и происходит редирект на страницу home. Тоесть если токена нет попасть на страницу home невозможно.

Я реализовал это в файле Home.js вот так:

const Home = () => {
    const token = localStorage.getItem("myToken")
    return (
        <div>
            {!token && <Redirect to="/" />}
            <Header/>
            <h1 >Home page</h1>
        </div>
    )
}

Но человек, который проверял мое приложение, написал:

Не самый лучший подход. Допустим у нас может быть много таких компонентов - и нам каждому придется такую логику писать? А если она изменится - то потом везде бегать менять?

Это он про то что логику :
{!token && <Redirect to="/" />}
я напиисал конкретно в файле Home.js

И он предложил, как это можно сделать по-другому:

Лучшим вариантом будет проверять у пользователя token на этапе роутинга, то есть разделить все роуты в приложении на неавторизованные и авторизованные


Это мой файл App.js, где у меня роутинг моего приложения:

const history = createBrowserHistory();

class App extends React.Component {
  render(){ 
    return (
      <BrowserRouter history={history}> 
         <div className="wrapper">
          <div className="content">

            <Switch>
              <Route exact path="/" component={SignupForm} /> 
              <Route path="/home" component={Home} />
              <Route path="/login" component={LoginForm} />
            </Switch>

           </div>
       </div>
    </BrowserRouter>
   )
  }
}


И у меня вопрос. Как можно сделать проверку наличия токена в localStorage на этапе роутинга(в файле App.js)?
  • Вопрос задан
  • 1118 просмотров
Решения вопроса 2
hzzzzl
@hzzzzl
погугли по слову protected route react
https://dev.to/skylerwebdev/setting-up-a-private-r...

идея такая, что сделать обертку для роутов с авторизацией, и сделать как то так

<Route exact path="/" component={SignupForm} /> 
<ProtectedRoute path="/home" component={Home} />  {/* если что, будет редиректить на "/" */}
<Route path="/login" component={LoginForm} />


https://medium.com/@s4y.solutions/react-route-4-pr...
Ответ написан
Для таких целей правильнее использовать приватный роут.
import React from 'react';
import { Route, Redirect, useLocation } from 'react-router-dom';

export const PrivateRoute = (props) => {
  const token = localStorage.getItem("myToken");
  const location = useLocation();

  if (token) {
    return <Route {...props} />
  }

  return (
    <Redirect to={{ pathname: '/', state: { from: location } }} />
  );
};


// Use Private Route
import { PrivateRoute } from './PrivateRoute';
import { Home } from './Home';

<PrivateRoute path="/home">
  <Home />
</PrivateRoute>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы