Angular 5 смешанных типов аутентификации с устаревшей системой
У нас есть устаревшая система, которую мы хотим перенести в Angular. Поскольку система большая, мы пойдем шаг за шагом и перенесем модуль за модулем.
Теперь, пока мы не закончили со всей Системой, нам, вероятно, нужно будет переключаться между Angular SPA и устаревшей системой, поскольку Angular не очень хорошо играет в приложении, как я читал.
Теперь, что вы делаете с аутентификацией? На стороне SPA будет JWT, и там будет соответствующая конечная точка для преобразования этого в аутентифицированного пользователя. На устаревшей стороне сеанс существует.
Но как мне справиться с переключением контекста (между SPA и Legacy), чтобы использовать оба, JWT and session cookie
? Я предполагаю хранить токен JWT И куки и хранить обе системы в общедоступной папке Legacy, проходить аутентификацию через Angular, отправлять и хранить оба типа.
Есть ли лучший способ добиться этого?
1 ответ
Извините, что я не смог ответить раньше. Один из способов, который я могу придумать для этого, - встроить iframe в каждую вашу Angular SPA и унаследованную систему, которая загружает страницу получения из другой системы. Эта принимающая страница выполняет вход / выход пользователя из другой системы. Кроме того, вы не хотите хранить JWT или что-то чувствительное в общей папке; используйте localStorage для JWT, и этого должно быть достаточно для поддержания сеанса на уровне клиента.
Для получения информации о реализации iframes вы можете обратиться к https://jcubic.wordpress.com/2014/06/20/cross-domain-localstorage/
Давайте посмотрим на следующие сценарии. В зависимости от того, как вы реализуете свою аутентификацию, для применения могут потребоваться некоторые изменения:
Сценарий 1: пользователь вошел в приложение Angular
Когда пользователь входит в ваш Angular SPA, аутентификация через устаревший API возвращает JWT и сохраняется в localStorage. Каждый раз, когда пользователь делает запрос через ваше приложение Angular, JWT отправляется через ваш заголовок авторизации, чтобы идентифицировать пользователя.
Теперь, когда JWT возвращается после входа в систему, отправьте сообщение о входе во встроенный iframe (указывая на вашу предыдущую страницу получения), чтобы получающая страница создала сеанс пользователя /cookie в вашем устаревшем домене. Вы должны установить cookie на то же время истечения, что и ваш JWT.
Сценарий 2: пользователь вышел из приложения Angular
Удалите JWT из вашего локального хранилища. Отправьте сообщение в свой iframe, чтобы файл cookie сеанса пользователя был уничтожен в вашем устаревшем домене.
Сценарий 3: пользователь вошел в наследство
Вам нужно будет немного изменить логин. Когда пользователь входит в вашу унаследованную систему, вам также необходимо сгенерировать JWT и вернуть его на страницу после успешного входа в систему. Отправьте сообщение через встроенный iframe (теперь указывающий на ваше приложение Angular), чтобы сохранить JWT в вашем localStorage в вашем домене SPA.
Вам не нужно создавать пользовательский сеанс на угловой стороне, поскольку JWT достаточно, но имейте в виду, что время истечения пользовательского сеанса должно синхронизироваться с вашим истечением JWT.
Сценарий 4: пользователь вышел из устаревшего
Отправьте сообщение в ваш Angular SPA через ifame, чтобы удалить JWT из localStorage. Опять же, вам не нужно беспокоиться о сеансе для вашего пользователя на вашем Angular конце, так как вы уже используете JWT для авторизации.
Несколько слов о безопасности
Очевидно, что для реализации этого подхода iframe вам нужно будет включить CORS, если ваши сайты находятся в разных доменах. Убедитесь, что вы применяете соответствующие меры безопасности для предотвращения таких эксплойтов, как XSS или встраивание iframe, загружающих ваши сайты в запрещенный домен.
Кроме того, когда я использую JWT, я генерирую идентификатор (JTI), делаю его частью полезной нагрузки JWT и сохраняю хешированный JTI в виде файла cookie. Таким образом, всякий раз, когда пользователь делает запрос с использованием JWT, я могу проверить, есть ли в браузере файл cookie JTI, и убедиться, что пользователь не просто украл JWT для использования на другом компьютере.
Дайте мне знать, если у вас есть дополнительные вопросы!