Какой пример azure-spring-boot-sample-active-directory использовать для проверки токена доступа в приложении Spring Boot, поступающем из приложения Vue.js?

У меня есть интерфейсное приложение (Vue.js), защищенное с помощью @azure/msal-browser. У меня есть «регистрация приложения» в Azure, проверяющая, является ли пользователь частью нашей AD и разрешен ли ему доступ к веб-странице. Это прекрасно работает. Пользователь должен сначала пройти аутентификацию, прежде чем он / она сможет получить доступ к веб-страницам.

Сама веб-страница выполняет несколько вызовов AJAX к REST API, который представляет собой не что иное, как приложение Spring Boot с включенным Spring Web. Этот бэкэнд не защищен ... пока (!).

Цель:

Я хочу защитить серверную часть, чтобы вы могли запрашивать REST API только в том случае, если у вас есть действующий токен доступа. Интерфейс добавит Authentication: Bearer XXX токен при выполнении вызовов к бэкэнду.

Я просмотрел примеры здесь: https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/azure-spring-boot-samples и вижу 4 варианта:

  • Azure-Spring-boot-sample-active-directory-resource-server-by-filter-stateless
  • Лазурный-весенний-загрузочный-образец-активный-каталог-ресурс-сервер-по-фильтру
  • Лазурный-весна-загрузка-образец-активный-каталог-ресурс-сервер-ОБО
  • Лазурный-весна-загрузка-образец-активный-каталог-ресурс-сервер

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

Вкратце:

Я хочу ...

  • ... авторизуйте пользователя во внешнем интерфейсе, используя msal-browser
  • ... выполнять запросы из внешнего интерфейса (ну, клиентский браузер, выполняющий вызовы AJAX) к бэкэнду, просто добавляя токен доступа в качестве заголовка
  • ... бэкэнд автоматически проверяет токен и, если он действителен, бэкэнд возвращает данные

Благодарим за отзыв!

3 ответа

@ Йохен Хеббрехт,

Я разработчик azure-spring-boot-starter-active-directory.

Я думаю, вам следует выбрать последний: azure-spring-boot-sample-active-directory-resource-server.

Кроме того, теперь я предлагаю вам выбрать другое решение: использовать spring-security-oauth2-resource-server вместо azure-spring-boot-starter-active-directory.

Вот примеры: https://github.com/Azure-Samples/azure-spring-boot-samples/tree/0eb5046b48298c9bd681133f4746b9b263becdc9/AzureActiveDirectory/OAuth2

Пример 03-resource-serverя думаю, это то, что ты хочешь. Вы можете просмотреть эти примеры один за другим, чтобы получить дополнительную информацию о том, как защитить свой REST API.

Если у вас есть вопросы, создайте проблему здесь: https://github.com/Azure-Samples/azure-spring-boot-samples/issues/new

Копия: @ Жан-Франсуа Фабр, я обновил предыдущий ответ, но не могу восстановить предыдущий ответ. Итак, я создал новый.

Раньше у меня была такая же идея, и вот мое решение.

Во внешнем интерфейсе с использованием msal.js, предоставленного Microsoft, для создания модуля входа и генерации через него токена доступа. Затем отправьте запрос ajax с токеном Bearer в заголовке запроса. В моем бэкэнд-приложении springboot обратитесь к этому образцу, чтобы добавить фильтр для проверки наличия во входящем запросе действующего токена доступа. Фильтр должен проверить, есть ли токен в заголовке запроса, затем декодировать его и проверить, истек ли токен, и имеет ли он правильную область, если это необходимо.

А вот еще одна задача, в которой нам нужно установить область для backend api. Для этого необходимо предоставить api в лазурном объявлении (создание приложения лазурного объявления и переход к открытию лезвия api для выполнения следующих действий). Вы можете обратиться к этому за подробностями. Пожалуйста, обратите внимание: представленный здесь api используется в качестве входного параметра при генерации токена доступа (нам нужно установить параметр, а открытый API - это область действия после добавления этого разрешения API в приложение Azure ad, используемое для создания токена доступа).

После этих действий фильтр может проверить, содержит ли токен заданную вами ранее область действия. Я думаю, что это самое важное для проверки токена.

Код фильтра: https://stackoverflow.com/a/66097364/14574199

А из-за модели frontend-backend вам может понадобиться фильтр CORS для вашего приложения springboot, например:

      package com.example.demo;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(Integer.MIN_VALUE)
@Component
public class CorsFilter implements Filter {
    @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Credentials", "true");
        res.addHeader("Access-Control-Allow-Origin", "*");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN,Authorization");
        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
          response.getWriter().println("ok");
          return;
        }
        chain.doFilter(request, response);
      }
      @Override
      public void destroy() {
      }
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
      }
}

@ Йохен Хеббрехт,

Вот образец для защиты вашего серверного REST API: https://github.com/Azure-Samples/azure-spring-boot-samples/tree/0eb5046b48298c9bd681133f4746b9b263becdc9/AzureActiveDirectory/OAuth2

Пример 03-resource-serverя думаю, это то, что ты хочешь. Вы можете просмотреть эти примеры один за другим, чтобы получить дополнительную информацию о том, как защитить свой REST API.

Если у вас есть какие-либо вопросы, создайте проблему здесь: https://github.com/Azure-Samples/azure-spring-boot-samples/issues/new

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