哪个 azure-spring-boot-sample-active-directory 示例用于验证来自 Vue.js 应用程序的 Spring 引导应用程序中的访问令牌?

Which azure-spring-boot-sample-active-directory example to use to validate access token in a Spring Boot application coming from a Vue.js application?

我有一个使用 @azure/msal-browser 保护的前端应用程序 (Vue.js)。我在 Azure 中有一个“应用程序注册”,用于验证用户是否是我们 AD 的一部分,以及是否允许 he/she 访问该网页。这很好用。用户需要先进行身份验证,然后 he/she 才能访问网页。

该网页本身对 REST API 执行多个 AJAX 调用,这只不过是一个启用了 Spring Web 的 Spring 启动应用程序。此后端不安全......还 (!)。

目标:

我想保护后端,以便您只有在拥有有效访问令牌的情况下才能查询 REST API。前端将在执行对后端的调用时添加 Authentication: Bearer XXX 令牌。

我查看了这里的示例:https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/azure-spring-boot-samples,我看到了 4 个选项:

前两个似乎有点过时,因为如果我在本地 运行 它们,我会收到所有 deprecated 警告。但是这些示例中的哪个可以涵盖我的用例?

总结:

我想...

感谢任何反馈!

我之前也有同样的想法,这是我的解决方案。

前端使用微软提供的msal.js实现登录模块,并通过它生成access token。然后在请求 header 中发送带有 Bearer 令牌的 ajax 请求。在我的 springboot 后端应用程序中,参考 this sample 添加过滤器以验证传入请求是否具有有效的访问令牌。过滤器需要检查请求中是否有令牌 header 然后对其进行解码并检查令牌是否过期,如果需要,是否具有正确的范围。

这里还有另一个任务,我们需要为后端设置范围 api。这需要在 azure ad 中公开 api(创建 azure ad 应用程序并去公开 api blade 以执行下一步操作)。详情可参考this。这里需要注意,这里暴露的api是用来作为生成access token时的入参(我们需要设置scope参数,暴露的api是加上这个api 对用于生成访问令牌的 azure 广告应用程序的权限。

完成这些操作后,过滤器可以检查令牌是否包含您之前自定义的范围。我认为这是验证令牌最重要的。

过滤代码:https://whosebug.com/a/66097364/14574199

并且由于 frontend-backend 模型,您可能需要像这样的 springboot 应用程序的 CORS 过滤器:

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 {
      }
}

@Jochen Hebbrecht,

我是 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

cc: @Jean-François Fabre,我更新了之前的答案,但我无法取消删除之前的答案。所以我创建了一个新的。