新 okta-spring-boot 2.1.1 中缺少 ImplicitAudienceValidatingTokenServices
ImplicitAudienceValidatingTokenServices missing from new okta-spring-boot 2.1.1
我已经将 Spring 启动应用程序从使用 okta-spring-boot-starter v0.61 升级到 v2.1.1
微服务现在总是抛出:
p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error="invalid_token", error_description="Invalid access token: ... TOKEN OMITTED
新的 (v2.1.1) OAuth2AuthenticationManager 连接了一个 org.springframework.security.oauth2.provider.token.DefaultTokenServices 的实例,它有一个空的 hashmap 并导致异常(因为 OAuth2AuthenticationManager 从 tokenServices.loadAuthentication(token)
返回 null
旧版 (v0.61) 实现使用了 com.okta.spring.oauth.implicit.ImplicitAudienceValidatingTokenServices
的实例
中的旧代码中自动创建的
ImplicitAudienceValidatingTokenServices is now gone from okta-spring-boot and so is ResourceConfig。我不清楚如何在 Okta Spring Boot Starter v2.1.1.
中启用相同的行为
关于 config/properties 我想恢复旧行为的任何想法?我不相信 Okta 甚至支持 'remote token validation'(不确定确切正确的技术短语)。本地验证对我们的目的来说仍然很好。
这些版本之间发生了很大变化。最大的是 Spring Security 的 OAuth 支持(Okta 库位于其之上)。确保您的类路径 spring-security-oauth
上没有旧的 Spring Sec 库。
related migration guide 也可能对您有帮助(取决于您在做什么)。
从这里可以配置两件事:
- 您的配置属性(那些应该保持不变
okta.oauth2.*
- 正在配置资源服务器。
对于最后一个,剩下的就是我们 new Spring Security API 配置资源服务器:
import com.okta.spring.boot.oauth.Okta;
import org.springframework.http.HttpMethod;
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;
@EnableWebSecurity
public class OAuth2ResourceServerSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// all requests are authenticated
.anyRequest().authenticated()
.and()
.oauth2ResourceServer().jwt(); // replace .jwt() with .opaqueToken() for Opaque Token case
// Send a 401 message to the browser (w/o this, you'll see a blank page)
// this is optional, and only needed if people are accessing your API manually through a browser
Okta.configureResourceServer401ResponseBody(http);
}
}
您可以在此处查看完整示例:https://github.com/okta/samples-java-spring/blob/master/resource-server/src/main/java/com/okta/spring/example/ResourceServerExampleApplication.java(只需添加您的属性)
Okta 特定的位被自动连接和配置,例如,Okta 特定的 JWT 验证(目前还没有官方的 JWT 访问令牌规范)。
此外,对于“远程令牌验证”,它在 Spring 节 API 中称为“不透明”,请参阅 .opaueToken()
代码块中的注释。
如上所述,我能够解决问题。
通过上面的例子,我也找到了另外一个。第一个更具体到一般Spring:https://github.com/spring-projects/spring-security-samples/blob/main/servlet/spring-boot/java/oauth2/resource-server/hello-security/src/main/java/example/OAuth2ResourceServerSecurityConfiguration.java
由于我使用的是 okta-spring-boot,所以我使用了 Brian 的示例:https://github.com/okta/samples-java-spring/blob/master/resource-server/src/main/java/com/okta/spring/example/ResourceServerExampleApplication.java
我做的第一件事是为 Spring Boot 添加两个新属性。这很令人困惑,因为我相信相同属性的名称在 Spring 的不同版本中至少有一次非常微妙的变化。有一些示例会以不同的方式出现在 Google 上,并且不会立即引起注意。这些对于 Spring Boot 2.5.4 和 Spring Core 5.3.9 是正确的:
spring.security.oauth2.resourceserver.jwt.issuer-uri: https://your domain.okta.com/oauth2/your_auth_server_id
(可能需要 /default 取决于您的应用程序的设置方式)
spring.security.oauth2.resourceserver.jwt.jwk-set-uri: url_above/v1/keys
我必须删除 @EnableResourceServer 并添加(基于上面的 Okta 示例)注释 @EnableGlobalMethodSecurity(prePostEnabled = true, secureEnabled = true)
在我的例子中,我们有一个 ResourceServerConfigurerAdapter 的实现,我将其更新为扩展 WebSecurityConfigurerAdapter 并使用 API 创建资源服务器:.and().oauth2ResourceServer().jwt();
我还需要做进一步的测试,并想了解 EnableGlobalMethodSecurity 上的选项,但目前我的 REST 端点将再次正确接受 Bearer 令牌。
我已经将 Spring 启动应用程序从使用 okta-spring-boot-starter v0.61 升级到 v2.1.1
微服务现在总是抛出:
p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error="invalid_token", error_description="Invalid access token: ... TOKEN OMITTED
新的 (v2.1.1) OAuth2AuthenticationManager 连接了一个 org.springframework.security.oauth2.provider.token.DefaultTokenServices 的实例,它有一个空的 hashmap 并导致异常(因为 OAuth2AuthenticationManager 从 tokenServices.loadAuthentication(token)
返回 null旧版 (v0.61) 实现使用了 com.okta.spring.oauth.implicit.ImplicitAudienceValidatingTokenServices
的实例 中的旧代码中自动创建的ImplicitAudienceValidatingTokenServices is now gone from okta-spring-boot and so is ResourceConfig。我不清楚如何在 Okta Spring Boot Starter v2.1.1.
中启用相同的行为关于 config/properties 我想恢复旧行为的任何想法?我不相信 Okta 甚至支持 'remote token validation'(不确定确切正确的技术短语)。本地验证对我们的目的来说仍然很好。
这些版本之间发生了很大变化。最大的是 Spring Security 的 OAuth 支持(Okta 库位于其之上)。确保您的类路径 spring-security-oauth
上没有旧的 Spring Sec 库。
related migration guide 也可能对您有帮助(取决于您在做什么)。
从这里可以配置两件事:
- 您的配置属性(那些应该保持不变
okta.oauth2.*
- 正在配置资源服务器。
对于最后一个,剩下的就是我们 new Spring Security API 配置资源服务器:
import com.okta.spring.boot.oauth.Okta;
import org.springframework.http.HttpMethod;
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;
@EnableWebSecurity
public class OAuth2ResourceServerSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// all requests are authenticated
.anyRequest().authenticated()
.and()
.oauth2ResourceServer().jwt(); // replace .jwt() with .opaqueToken() for Opaque Token case
// Send a 401 message to the browser (w/o this, you'll see a blank page)
// this is optional, and only needed if people are accessing your API manually through a browser
Okta.configureResourceServer401ResponseBody(http);
}
}
您可以在此处查看完整示例:https://github.com/okta/samples-java-spring/blob/master/resource-server/src/main/java/com/okta/spring/example/ResourceServerExampleApplication.java(只需添加您的属性)
Okta 特定的位被自动连接和配置,例如,Okta 特定的 JWT 验证(目前还没有官方的 JWT 访问令牌规范)。
此外,对于“远程令牌验证”,它在 Spring 节 API 中称为“不透明”,请参阅 .opaueToken()
代码块中的注释。
如上所述,我能够解决问题。
通过上面的例子,我也找到了另外一个。第一个更具体到一般Spring:https://github.com/spring-projects/spring-security-samples/blob/main/servlet/spring-boot/java/oauth2/resource-server/hello-security/src/main/java/example/OAuth2ResourceServerSecurityConfiguration.java
由于我使用的是 okta-spring-boot,所以我使用了 Brian 的示例:https://github.com/okta/samples-java-spring/blob/master/resource-server/src/main/java/com/okta/spring/example/ResourceServerExampleApplication.java
我做的第一件事是为 Spring Boot 添加两个新属性。这很令人困惑,因为我相信相同属性的名称在 Spring 的不同版本中至少有一次非常微妙的变化。有一些示例会以不同的方式出现在 Google 上,并且不会立即引起注意。这些对于 Spring Boot 2.5.4 和 Spring Core 5.3.9 是正确的:
spring.security.oauth2.resourceserver.jwt.issuer-uri: https://your domain.okta.com/oauth2/your_auth_server_id
(可能需要 /default 取决于您的应用程序的设置方式)
spring.security.oauth2.resourceserver.jwt.jwk-set-uri: url_above/v1/keys
我必须删除 @EnableResourceServer 并添加(基于上面的 Okta 示例)注释 @EnableGlobalMethodSecurity(prePostEnabled = true, secureEnabled = true)
在我的例子中,我们有一个 ResourceServerConfigurerAdapter 的实现,我将其更新为扩展 WebSecurityConfigurerAdapter 并使用 API 创建资源服务器:.and().oauth2ResourceServer().jwt();
我还需要做进一步的测试,并想了解 EnableGlobalMethodSecurity 上的选项,但目前我的 REST 端点将再次正确接受 Bearer 令牌。