我已经将我们的Spring Boot应用程序从使用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被连接到一个实例它有一个空的hashmap,并导致tokenServices.loadAuthentication(token)
的异常(因为OAuth2AuthenticationManager返回null)。OLD (v0.61)实现使用了com.okta.spring.oauth. implicitaudiencevalidatingtokenservices的实例
在ResourceServerConfig
的旧代码中自动创建ImplicitAudienceValidatingTokenServices现在从okta-spring-boot中消失了,resourcecconfig也是如此。我不清楚如何在Okta Spring Boot Starter v2.1.1中启用相同的行为。
关于我缺少什么配置/属性来恢复旧行为的任何想法?我不相信Okta甚至支持"远程令牌验证"(不确定确切正确的技术短语)。对于我们的目的,本地验证仍然很好。
这些版本之间变化很大。其中最大的是Spring Security的OAuth支持(Okta库位于其之上)。确保您的类路径spring-security-oauth
上没有旧的Spring Sec库。相关的迁移指南也可能对您有所帮助(取决于您正在做什么)。
从这里有两件事要配置:
- 您的配置属性(这些应该保持不变)
okta.oauth2.*
- 配置资源服务器。
对于最后一个,我们只剩下新的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 Sec 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中至少有一次非常微妙的变化。有一些不同方式的例子会出现在谷歌上,但不会立即被注意到。这些是正确的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端点将再次正确地接受承载令牌。