Служба Spring Boot REST – аутентификация конечного пользователя против приложения (REST client) Аутентификация

#spring-boot #spring-security #amazon-cognito #spring-security-oauth2 #spring-rest

#spring-boot #spring-безопасность #amazon-cognito #spring-безопасность-oauth2 #spring-rest

Вопрос:

Я просмотрел множество сообщений и статей, но не нашел простого решения для приведенного ниже случая, которое я должен реализовать.

Платформа: Spring Boot 2.x.x (Spring Security 5.x.x) со встроенным Tomcat

Решение: служба REST, которая использует множество клиентских приложений и множество конечных пользователей.

  1. Я должен реализовать конечную точку REST /api/search , доступную для многих клиентских приложений. В качестве примера можно привести веб-приложение APP-X (Angular), веб-приложение APP-Y (Jquery / Bootstrap) и мобильное приложение APP-Z (IOS). Все три клиента являются отдельными объектами (как с технической точки зрения, так и с точки зрения бизнеса).

  2. Итак, я должен аутентифицировать вышеупомянутое приложение, используя одноразовый токен. Поэтому я планировал перейти на Spring OAuth2, включив @EnableAuthorizationServer и @EnableResourceServer . Для каждого клиента приложения я сгенерирую токен, и они смогут использовать его при подключении к моей службе REST. Верен ли этот подход?

  3. Помимо приложений-клиентов, система имеет возможность регистрировать и входить в систему для конечных пользователей. Также моя конечная точка ( /api/search ) может получать доступ как к анонимным пользователям, так и к пользователям, которые зарегистрировались под ROLE_REGUSER ролью. И через контекст безопасности мне нужно получить доступ к данным пользователя как к обычной аутентификации пользователя.

  4. Это то место, где я застрял. Как я могу выполнить следующие пункты вместе, используя Spring Security 5.x.x (Spring Boot 2.x.x).

I. Аутентификация как клиентских приложений, так и конечных пользователей.
II. Разрешить доступ для анонимных пользователей и зарегистрированных пользователей для одной и той же конечной точки.

Я приложил небольшую диаграмму для разработки вышеупомянутого сценария.

Спасибо

введите описание изображения здесь

Ответ №1:

Я нашел решение, когда обновил свою версию spring security до 5.2.
В версии 5.2 они обесценились @EnableAuthorizationServer и @EnableResourceServer . Поэтому мне пришлось перейти к внешнему поставщику авторизации, который поддерживает auth2. Я выбрал AWS Cognito и выполнил вышеуказанное требование, используя опцию пула пользователей.

В AWS Cognito

  1. Я создал пул пользователей.
  2. Затем создал два клиента приложений в одном пуле пользователей.
  3. Один клиент приложения настроен как поддержка потока учетных данных клиента.
  4. Второй клиент приложения настроен как поддержка потока аутентификации пользователя.

В клиентских приложениях

  1. Извлекайте токен доступа непосредственно из AWS Cognito, используя учетные данные клиента, и используйте для защиты всех вызовов API.
  2. Если пользователь входит в систему на любом этапе, извлеките токен доступа непосредственно из AWS Cognito, используя код авторизации, и замените любой существующий токен доступа.

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

На сервере ресурсов (внутренний API / Spring Boot)

  1. Проверьте токен доступа.