Вызов службы B из службы A для аутентификации и авторизации

#node.js #architecture #microservices

Вопрос:

У меня есть служба Ticketing и служба Auth .

Не всем разрешено выполнять CRUD по билетам.

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

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

Как я могу сделать этот звонок?

  1. Должен ли я выполнить синхронизирующий вызов? т. е. Прямой вызов из службы A в службу B?
  2. Используйте шину событий

Или любыми другими возможными способами?

Кроме того, есть несколько таблиц, которые необходимы Auth службе для объединения со Ticketing службой для извлечения данных.

Как можно решить эту проблему?

Ответ №1:

Учитывая тег микросервисов, я предполагаю Ticketing , что и Auth являются отдельными микросервисами.

Я также предполагаю, основываясь на описании, что у каждого есть свой собственный API.

Что не совсем ясно, так это то, как пользователь получил доступ к Ticketing сервису. Были ли они сначала аутентифицированы (например, если пользователь-человек через веб-приложение, входил ли он в систему первым, до Ticketing того, как его каким-либо образом направили).

Я предполагаю, что сначала был выполнен вход в систему.

Подход может заключаться в

  1. В момент входа пользователя (или вызывающего абонента, если он не является человеком) получите список разрешений, к которым пользователь имеет доступ через Auth службу.
  2. Сохраните разрешения в заголовке авторизации HTTP
  3. Поскольку вызывается каждая микросервисная служба, ей нужно только (синхронно) попросить Auth службу проверить правильность списка разрешений.

Подходящим технологическим подходом является JWT.
В описанном выше сценарии при Auth первом вызове для аутентификации пользователя/вызывающего абонента разрешения могут быть возвращены в рамках sub утверждения, или вы можете создать свое собственное утверждение для определения используемых разрешений.

Поскольку пользователь/вызывающий абонент перемещается через различные микросервисы, синхронный вызов Auth службы требуется только для подтверждения авторизации пользователя/вызывающего абонента.

Синхронный или асинхронный: независимо от шины прямого вызова/события, если требуется проверка авторизации, она должна быть завершена до того, как вызывающая служба начнет действовать. В противном случае он может предоставить данные / изменить их, когда у вызывающего абонента не было авторизации.

Объединение таблиц: в шаблоне микросервиса это вряд ли будет разумно. Скорее, получите необходимые данные от Auth службы с помощью вызова API и используйте их с вызывающей службой (например Ticketing ).