spring-security 我可以同时使用自检服务器和本地检查来获取授权令牌吗?Sping Boot -安全

mwyxok5s  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(224)

我想
1.在远程服务器上内省JWT标记
1.然后在本地检查scope/aud/iss/exp是否正确
如何在Sping Boot 中最轻松地完成此操作?
据我所知,第一种情况类似于opauqeToken功能(但我使用的是普通的JWT),第二种情况更像是使用jwt
Spring Security只支持JWT或不透明令牌,不能同时支持这两者。
如果我使用opaqueToken,那么远程服务器上的验证就可以轻松完成(即使是JWT)

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
            .authorizeHttpRequests(authorize -> authorize
                    .mvcMatchers("/api/**").hasAuthority("SCOPE_" + scope)
                    .anyRequest().authenticated()
            )
            .oauth2ResourceServer(oauth2 -> oauth2
                    .opaqueToken(opaque -> opaque
                            .introspectionUri(this.introspectionUri)
                            .introspectionClientCredentials(this.clientId, this.clientSecret)
                    ));
    return http.build();

我已经验证了作用域。现在我想检查issaudexp。这对opaqueToken可行吗?
还是应该使用jwt身份验证?
IMHO opaqueToken可以是JWT,所以现在的问题是如何在远程自省之后在本地验证和检查它?
这是两种不同方法的混合,但希望你知道如何做到这一点的简单方法。

ecr0jaav

ecr0jaav1#

好的,我想我有答案了。我创建了自己的内省器,它实现了OpaqueTokenIntrospector

public class JwtOpaqueTokenIntrospector implements OpaqueTokenIntrospector {

    private OpaqueTokenIntrospector delegate =
            new NimbusOpaqueTokenIntrospector(
                    "introspect-url",
                    "client-id",
                    "client-secret"
            );

    @Override
    public OAuth2AuthenticatedPrincipal introspect(String token) {
        OAuth2AuthenticatedPrincipal introspected = this.delegate.introspect(token);
        // SOME LOGIC
    }
}

我把它添加为@Bean

@Bean
    public OpaqueTokenIntrospector tokenIntrospector() {
        return new JwtOpaqueTokenIntrospector();
    }

相关问题