如何使用Azure AD B2C保护Spring Boot REST API?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Azure AD B2C保护Spring Boot REST API?相关的知识,希望对你有一定的参考价值。

我正在将Spring Boot 2.2.0和azure-active-directory-b2c-spring-boot-starter 2.2.0一起使用。我设法用它来保护Thymeleaf网页(按照他们的教程)。现在,我想拥有一种以相同方式保护的REST API,因为实际的应用程序将是对我的Spring Boot后端执行REST调用的移动应用程序。

我已经想出了如何通过以下方式使用密码授予流程获取令牌:

POST https://<my-tenant-id>.b2clogin.com/<my-tenant-id.onmicrosoft.com/oauth2/v2.0/token?p=B2C_1_<my-custom-policy>

((以用户名和密码作为参数)

因此,移动应用可以使用该呼叫。但是,我应该如何配置Spring Boot应用程序,以便在API调用上使用Authorization: Bearer <access-token>起作用?我需要什么依赖项/启动器,应该如何配置?

更新:

我尝试添加:

<dependency>
  <groupId>org.springframework.security.oauth</groupId>
  <artifactId>spring-security-oauth2</artifactId>
  <version>2.3.7.RELEASE</version>
</dependency>

使用:

@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class OAuth2ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId("my-azure-b2c-test");
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/**")
            .authenticated();
    }
}

但是当我在Spring Boot应用程序上执行请求时,出现401并显示“ invalid_token”错误。

答案

一旦您知道,解决方案似乎就很简单。

首先,添加以下依赖项:

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-resource-server</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-jose</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>

下一步在spring.security.oauth2.resourceserver.jwt.jwk-set-uri文件中指定application.properties属性。

要知道此值,请在GET上执行https://<my-tenant-id>.b2clogin.com/<my-tenant-id>.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_<my-custom-policy>(使用cURL或其他工具)

这将返回具有jwks_uri值的JSON正文。将该值放入application.properties文件中。

现在在项目中创建此Java类:

import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/**")
            .authenticated()
            .and()
            .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
    }
}

如果现在有这样的控制器:

@RestController
public class ApiController {

    @GetMapping("/api/test")
    public String apiTest(@AuthenticationPrincipal Principal principal) {
        return "test " + principal;
    }
}

[如果您使用正确的api/test标头(并且其类型为Authorization)对org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken执行GET,则主体将不为空]

唯一不幸的是校长没有权限,我仍然需要弄清楚原因。

以上是关于如何使用Azure AD B2C保护Spring Boot REST API?的主要内容,如果未能解决你的问题,请参考以下文章

在 Postman 中为受 Azure AD B2C 保护的 Azure Function App 请求访问令牌

Azure AD B2C FedRAMP是否获得授权?

在 Azure AD B2C 中请求令牌时缺少范围“scp”

Azure AD B2C中的Web API链(On-Behalf-Of)

如何从Azure AD B2C获取用户组信息

如何在 Azure AD B2C 中管理用户流之间的单个帐户/会话