Реагирующий маршрутизатор не распознает токен аутентификации (AAD B2C) в режиме инкогнито

#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. Вы можете проверить, готово ли хранилище или нет, и если оно не готово, перезагрузите страницу с некоторым интервалом.