Какой пример 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.
Пример
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 используется в качестве входного параметра при генерации токена доступа (нам нужно установить
После этих действий фильтр может проверить, содержит ли токен заданную вами ранее область действия. Я думаю, что это самое важное для проверки токена.
Код фильтра: 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