如何使用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 中请求令牌时缺少范围“scp”