新 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

的实例

这是在 ResourceServerConfig

中的旧代码中自动创建的

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 也可能对您有帮助(取决于您在做什么)。

从这里可以配置两件事:

  1. 您的配置属性(那些应该保持不变 okta.oauth2.*
  2. 正在配置资源服务器。

对于最后一个,剩下的就是我们 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 令牌。