#node.js #architecture #microservices
Вопрос:
У меня есть служба Ticketing
и служба Auth
.
Не всем разрешено выполнять CRUD по билетам.
Когда приходит запрос на выполнение действия по билету, мне нужно проверить, имеет ли пользователь соответствующие права.
Для этого мне нужно связаться со службой Auth
, которая содержит роли и конечные точки разрешенных разрешений на ресурс для пользователя.
Как я могу сделать этот звонок?
- Должен ли я выполнить синхронизирующий вызов? т. е. Прямой вызов из службы A в службу B?
- Используйте шину событий
Или любыми другими возможными способами?
Кроме того, есть несколько таблиц, которые необходимы Auth
службе для объединения со Ticketing
службой для извлечения данных.
Как можно решить эту проблему?
Ответ №1:
Учитывая тег микросервисов, я предполагаю Ticketing
, что и Auth
являются отдельными микросервисами.
Я также предполагаю, основываясь на описании, что у каждого есть свой собственный API.
Что не совсем ясно, так это то, как пользователь получил доступ к Ticketing
сервису. Были ли они сначала аутентифицированы (например, если пользователь-человек через веб-приложение, входил ли он в систему первым, до Ticketing
того, как его каким-либо образом направили).
Я предполагаю, что сначала был выполнен вход в систему.
Подход может заключаться в
- В момент входа пользователя (или вызывающего абонента, если он не является человеком) получите список разрешений, к которым пользователь имеет доступ через
Auth
службу. - Сохраните разрешения в заголовке авторизации HTTP
- Поскольку вызывается каждая микросервисная служба, ей нужно только (синхронно) попросить
Auth
службу проверить правильность списка разрешений.
Подходящим технологическим подходом является JWT.
В описанном выше сценарии при Auth
первом вызове для аутентификации пользователя/вызывающего абонента разрешения могут быть возвращены в рамках sub
утверждения, или вы можете создать свое собственное утверждение для определения используемых разрешений.
Поскольку пользователь/вызывающий абонент перемещается через различные микросервисы, синхронный вызов Auth
службы требуется только для подтверждения авторизации пользователя/вызывающего абонента.
Синхронный или асинхронный: независимо от шины прямого вызова/события, если требуется проверка авторизации, она должна быть завершена до того, как вызывающая служба начнет действовать. В противном случае он может предоставить данные / изменить их, когда у вызывающего абонента не было авторизации.
Объединение таблиц: в шаблоне микросервиса это вряд ли будет разумно. Скорее, получите необходимые данные от Auth
службы с помощью вызова API и используйте их с вызывающей службой (например Ticketing
).