Управление сессией пользователей в Micro frontend - PullRequest
2 голосов
/ 17 октября 2019

Мы планируем перейти на микро-интерфейс, наш проект в Asp.Net Core MVC, в котором нам нужно несколько приложений, каждое из которых принадлежит разной команде, где они могут разрабатывать, тестировать, развертывать независимо. что я ищу, так это то, что если у каждого компонента внешнего интерфейса будет свой собственный URL-адрес, поскольку мы хотим, чтобы компонент развертывался независимо, отдельный URL-адрес означает, что это его собственный сервер и среда хоста, и как мы можем управлять сеансами между несколькими компонентами? Также было бы замечательно, если бы кто-то мог руководствоваться в микрообласти, учитывая:

  1. Безопасность
  2. Независимый развертываемый компонент
  3. Передача событий или обмен данными между компонентами
  4. Оркестровка компонентов по главной странице

1 Ответ

1 голос
/ 29 октября 2019

Ваш вопрос очень открытый. Мы внедрили микро интерфейсы в прошлом году, так что вот как мы это делаем. Это ни в коем случае не является «единственным способом» создания микро-интерфейсов. Если вы не видели их, их стоит прочитать, поскольку они охватывают наиболее распространенные архитектурные шаблоны, возникающие при проектировании микро-интерфейсов:

  1. Микро-интерфейсы
  2. Мозаика проекта
  3. Одиночный SPA

Шаблоны делятся на две категории:

  1. Управление рендерингом внешнего интерфейса, находящимся исключительно в коде на стороне клиента (это делает Single SPA)
  2. Управление рендерингом внешнего интерфейса, частично находящимся на стороне клиента, частично на стороне сервера

Технически вы можете добавитьтретий:

Управление рендерингом веб-интерфейса, полностью находящимся на стороне сервера

Мы реализовали # 2, и Project Mosaic, связанный выше, также делает это. Наш дизайн немного отличается от архитектуры мозаики. Вот как работает наше приложение:

  1. У нас есть магазин с описанием шаблонов, которые будут отображаться. Для этого мы используем Redis, но это может быть любое хранилище данных. Шаблоны содержат:

    a. Маршруты, по которым должен отображаться шаблон (это регулярное выражение)

    b. «Области» в шаблоне, которые должны быть отображены. Они содержат идентификатор и ранг, поэтому служба, отвечающая за рендеринг, может правильно сортировать шаблоны

    c. «Ресурсы» в шаблоне, которые должны быть отображены. Они содержат сценарии и теги ссылок, которые будут помещены в DOM.

    d. Родительский шаблон, если таковой имеется, вместе с областью на родительском шаблоне, где должен отображаться дочерний шаблон

  2. У нас есть приложение на стороне сервера, которое определяет подходящие шаблоны для данного маршрутаи создает JSON-представление DOM для этого маршрута.

  3. У нас есть клиентское приложение, которое поддерживает частичное представление DOM в качестве Virtual DOM, рендеринг JSON-представления возвращаетсясерверное приложение в Virtual DOM, которое используется для окончательной визуализации реальных изменений в DOM при изменении маршрута.

    Клиентское приложение также отвечает за прослушивание изменений с использованием History API,и запросить у бэкэнда обновления для представления DOM по заданному маршруту.

  4. Мы строим наши микро-интерфейсы на основе общего шаблона, который мы разработали. После завершения мы загружаем в CDN и используем адрес CDN в вышеупомянутых ресурсах шаблона для рендеринга внешнего интерфейса по соответствующим маршрутам.

В общих чертах, так разработано наше приложение внешнего интерфейса. ,Мы используем Kubernetes и воспользовались преимуществами написания пользовательских контроллеров в сочетании с пользовательскими определениями ресурсов, чтобы легко развернуть наши интерфейсы. Но вы можете сделать это просто с любым хранилищем данных, Kubernetes не нужен.

Относительно сеанса пользователя, аутентификации и т. Д. Это наша установка:

  1. Сервер авторизации

    а. Предоставляет страницу входа в систему

    b. Устанавливает токен JWT в локальное хранилище при успешном входе в систему

  2. Клиентское приложение для перехвата fetch запросов, вставляя заголовок Authorization с токеном JWT из локального хранилища

  3. Функция обратного прокси-сервера Traefik ForwardAuth для проверки JWT в Authorization to:

    a. Подтвердите сеанс пользователя

    b. Определить пользователя

    c. Найдите пользователя и его разрешения

  4. Хранилище данных (Redis), чтобы установить требования авторизации для данного маршрута. Это очень похоже на шаблоны, описанные выше. Информация об авторизации, содержащаяся в этом хранилище данных, состоит из:

    a. Маршруты, к которым относятся требования (как регулярное выражение)

    б. Применимые разрешения, которые должны применяться

    Опять же, для этого мы создали пользовательский контроллер и пользовательское определение ресурса, чтобы легко создавать и удалять требования авторизации для нашего приложения. Но в этом нет необходимости.

    Когда запрос поступает через обратный прокси-сервер, вызывается сервер аутентификации, проверяется токен пользователя, ищется его профиль и ищутся требования приложения для маршрута ипо сравнению с разрешениями, предоставленными пользователю. Если это подтвердится, ответ верен в Traefik, если нет - 401 Not Authorized, и traefik отклонит запрос.

Это все на довольно высоком уровне. Но на самом деле это очень хороший дизайн для нас, потому что у нас есть всего несколько мест, где обрабатывается авторизация, и разработчикам не нужно обращать никакого внимания на авторизацию при написании своих веб-интерфейсов (или бэкэндов в этом отношении, поскольку мы также используем микро-сервис). архитектура на бэкэнде).

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...