Аутентификация и авторизация в микросервисной архитектуре

У меня есть несколько услуг:

  • пользователь
  • Сообщение
  • Комментарий
  • Аутентификация
  • Конечная точка GraphQL

И скажем, они связаны друг с другом, как это:

пример 1

Все сервисы обмениваются данными через gRPC по закрытой сети, и авторизация выполняется с использованием токенов jwt.

Подход 1. Служба graphql отвечает за аутентификацию пользователя и гарантирует, что пользователь авторизован для выполнения указанной процедуры. Между службами нет аутентификации пользователя, но есть аутентификация TLS. Сервисы не проверяют авторизацию.

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

Есть ли лучший подход, который все еще сохраняет безопасность подхода 2, но создает небольшие накладные расходы, такие как подход 1?

-----Обновить-----

Подход 3: То же, что и в подходе 2, но аутентификация пользователя выполняется только в сервисе GraphQL с использованием сервиса Auth. Авторизация осуществляется путем проверки метаданных, переданных в обход. И между сервисами есть TLS-аутентификация.

1 ответ

Решение

Давайте рассмотрим запрос, который переходит от аутентифицированного пользователя к сервису A и к сервису B. JWT должен передаваться при каждом из этих вызовов.

Обе службы сначала проверяют подлинность пользователя, что просто делается путем проверки JWT. Затем каждый сервис будет извлекать всю информацию, необходимую для авторизации пользователя от пользователя, например, sub Запрос. Он будет использовать эту информацию, чтобы решить, авторизован ли пользователь в отношении операции, которую служба должна выполнять от имени пользователя. Только после успешной авторизации сервис сможет что-либо сделать.

Это не было бы накладными расходами, но необходимо, чтобы служба B могла аутентифицировать и авторизовать пользователя. Если не передать JWT из службы A в службу B, служба B не сможет ничего узнать о пользователе.

Другие вопросы по тегам