gpt4 book ai didi

java - 如何确保 Spring Security 安全资源服务器仅接受来自自己应用程序的 JWT token

转载 作者:太空宇宙 更新时间:2023-11-04 09:18:39 25 4
gpt4 key购买 nike

我正在将 Spring Security 与 Spring Boot 2.2.0 结合使用,尝试使用 spring-security-oauth2-resource-server:5.2.0 让 Azure AD B2C 正常工作。和spring-security-oauth2-jose:5.2.0 .

使用此配置:

@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);
}
}

spring.security.oauth2.resourceserver.jwt.jwk-set-uri设置在我的application.properties .

我可以从 Azure AD B2C 获取 token 并使用该 token 访问我自己的 API 终结点。但是,如果我使用另一个目录中的 token ,也可以访问端点。

我确实在主体的声明中看到它来自另一个 azure 目录。这是我需要在我的应用程序中手动添加的内容(测试应用程序 ID 是否与声明中匹配)?或者我应该添加一些我还没有完成的其他配置?

我还尝试使用 JwtDecoders.fromOidcIssuerLocation("https://mycompb2ctestorg.b2clogin.com/mycompb2ctestorg.onmicrosoft.com/v2.0/?p=B2C_1_ropc_flow"); 添加我自己的 JwtDecoder bean ,但这给出了:

java.lang.IllegalStateException: The Issuer "https://mycompb2ctestorg.b2clogin.com/60780907-bc3a-469a-82d1-b89ffed655af/v2.0/" 
provided in the configuration did not match the requested issuer
"https://mycompb2ctestorg.b2clogin.com/mycompb2ctestorg.onmicrosoft.com/v2.0/?p=B2C_1_ropc_flow"

此外,使用:

spring.security.oauth2.resourceserver.jwt.issuer-uri=https://mycompb2ctestorg.b2clogin.com/mycompb2ctestorg.onmicrosoft.com/v2.0/?p=B2C_1_ropc_flow

给出了与尝试声明我自己的 JwtDecoder 相同的异常 bean 。

最佳答案

阅读完 custom token validators 后在 Spring Security 文档中,我添加了一个自定义 validator ,用于检查受众声明以确保 token 是为我自己的应用程序颁发的。为此,请创建此 validator 类:

private static class AudienceValidator implements OAuth2TokenValidator<Jwt> {

@Override
public OAuth2TokenValidatorResult validate(Jwt token) {
if (token.getAudience().contains("my-application-id-here")) {
return OAuth2TokenValidatorResult.success();
} else {
return OAuth2TokenValidatorResult.failure(
new OAuth2Error("invalid_token", "The audience is not as expected, got " + token.getAudience(),
null));
}
}
}

并通过在 WebSecurityConfigurerAdapter 配置类中声明您自己的 JwtDecoder bean 来使用它:

@Bean
public JwtDecoder jwtDecoder() {
NimbusJwtDecoder result = NimbusJwtDecoder.withJwkSetUri(properties.getJwt().getJwkSetUri()).build();
result.setJwtValidator(
new DelegatingOAuth2TokenValidator<Jwt>(
JwtValidators.createDefault(),
new AudienceValidator())
);
return result;
}

默认 validator 将检查时间戳等内容。如果没问题,AudienceValidator 将检查受众声明。

注意:您在 DelegatingOAuth2TokenValidator 中传入 validator 的顺序定义了 JWT token 的检查顺序。在此示例中,在观众之前检查时间戳。如果您希望首先进行受众检查,则需要将其首先放在 DelegatingOAuth2TokenValidator

的构造函数中

关于java - 如何确保 Spring Security 安全资源服务器仅接受来自自己应用程序的 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58641531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com