#reactjs #react-router-dom #incognito-mode
#reactjs #react-router-dom #режим инкогнито
Вопрос:
Я использую пакет react-azure-adb2c для аутентификации пользователей в моем веб-приложении. У меня react-router-dom
настроен маршрут, требующий аутентификации:
import React from 'react';
import { Route, BrowserRouter as Router, Switch } from 'react-router-dom';
import authentication from 'react-azure-adb2c';
import Home from '../Home';
import Products from '../Products';
authentication.initialize({
instance: 'https://login.microsoftonline.com/tfp/',
tenant: process.env.REACT_APP_AAD_DOMAIN,
signInPolicy: process.env.REACT_APP_AAD_POLICY_ID,
applicationId: process.env.REACT_APP_AAD_CLIENT_ID,
scopes: [process.env.REACT_APP_AAD_SCOPES],
cacheLocation: 'sessionStorage',
redirectUri: process.env.REACT_APP_URL,
postLogoutRedirectUri: process.env.REACT_APP_URL,
});
function App() {
return (
<Router>
<Switch>
<Route exact path="/" component={Home} />
<Route
exact
path="/products"
component={authentication.required(Products)}
/>
</Switch>
</Router>
);
}
export default App;
Это работает, как и ожидалось, в обычном окне браузера, пользователь нажимает на ссылку /products
, перенаправляется на страницу входа в Azure AD B2C, возвращается в приложение при входе в систему, а затем перенаправляется на /products
.
Но в браузере incognito, когда пользователь возвращается в приложение после входа в систему, он перенаправляется обратно на страницу входа в Azure во второй раз. Если они снова войдут в систему со вторым запросом, они будут перенаправлены /products
, как и должны были в первый раз.
Я предполагаю, что маршрутизатор пытается перенаправить пользователя на аутентифицированный маршрут до того, как приложение распознает токен, но я не совсем уверен. Опять же, это происходит только в браузере инкогнито.
Комментарии:
1. Это всего лишь предположение, но, возможно, если вы измените cacheLocation: ‘sessionStorage’ на ‘localStorage’, это сработает. Возможно, какая-то информация, необходимая Azure ad b2c, сохраняется там, а затем при перенаправлении она удаляется. Просто предположение.
2. Ценю это! Я уже пробовал это с теми же мыслями, о которых вы упомянули.
Ответ №1:
Это связано с тем, что в качестве окон для инкогнито / частного просмотра не будет сохраняться локальное / сеансовое хранилище.
Вы можете использовать localStorage в Chrome и Firefox, однако частное хранилище не зависит от неприватного / частного Windows, т.Е. Установка элемента в приватном режиме не будет отражаться обратно в неприватный режим.
Данные локального хранилища, хранящиеся в обычных сеансах просмотра, будут недоступны при открытии браузера в режиме приватного просмотра или в режиме инкогнито.
Ссылка на MDN:
Когда включен режим частного просмотра, создаются временные базы данных, которые будут использоваться для файлов cookie и локального хранилища; эти базы данных удаляются, когда режим частного просмотра отключен, а обычные базы данных активируются повторно. Временные базы данных cookie и локального хранилища начинаются пустыми. Еще.
Комментарии:
1. Я должен был уточнить, это происходит независимо от стадии, на которой я вхожу в приложение. Я могу воссоздавать этот сценарий каждый раз, когда я вхожу в систему инкогнито, а не только при переключении с обычного браузера. Сеанс тот же, поэтому locaStorage не выбрасывается.
2. кажется, что хранилище не готово в первый раз, и после повторного перенаправления пользователя приложение может получить доступ к хранилищу.
3. Вы можете проверить, готово ли хранилище или нет, и если оно не готово, перезагрузите страницу с некоторым интервалом.