1. Почему вы решили, что токен нельзя хранить в localStorage? Храните его либо там, либо в cookie и проверяйте наличие при инициализации вашего приложения.
2. Если пользователь присылает невалидный токен или делает запрос по защищенному пути без токена, возвращайте с сервера код 401 и обрабатывайте ошибку на клиенте.
Идеальным вариантом будет использовать один обработчик для всех запросов.
На примере axios:
axios.interceptors.response.use(
res => res,
error => {
if (
error.response &&
error.response.status === 401 &&
error.response.data.message === 'Unauthorized' &&
isSignedIn
) {
store.dispatch(logout());
}
return Promise.reject(error);
},
);
3. Достаточно при инициализации при наличии токена, например сделать запрос за данными о пользователе. И в зависимости от ответа отрисовывать нужную версию приложения.