Spring Security OAuth2 check_token端点

spring spring-security oauth-2.0 spring-security-oauth2

21691 观看

3回复

746 作者的声誉

我正在尝试使用spring security oauth设置资源服务器以使用单独的授权服务器。我正在使用RemoteTokenServices哪个需要/check_token端点。

我可以看到/oauth/check_token端点在@EnableAuthorizationServer使用时默认启用。但是,默认情况下无法访问端点。

是否应手动添加以下条目以将此端点列入白名单?

http.authorizeRequests().antMatchers("/oauth/check_token").permitAll();

这将使所有人都可以访问此端点,这是否是所需的行为?或者我错过了什么。

提前致谢,

作者: sowdri 的来源 发布者: 2014 年 11 月 5 日

回应 (3)


20

1362 作者的声誉

你必须

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
   oauthServer.checkTokenAccess("permitAll()");    
}

有关这方面的更多信息::

如何使用RemoteTokenService?

作者: Pratik Shah 发布者: 06.11.2014 07:21

0

1286 作者的声誉

首先,配置令牌访问表达式:

@Override
public void configure(AuthorizationServerSecurityConfigurer securityConfigurer) throws Exception {
    securityConfigurer
            .allowFormAuthenticationForClients()
            .checkTokenAccess("isAuthenticated()")
            .addTokenEndpointAuthenticationFilter(checkTokenEndpointFilter());
}

然后,我们需要定义过滤器来处理客户端身份验证:

@Bean
public ClientCredentialsTokenEndpointFilter checkTokenEndpointFilter() {
    ClientCredentialsTokenEndpointFilter filter = new ClientCredentialsTokenEndpointFilter("/oauth/check_token");
    filter.setAuthenticationManager(authenticationManager);
    filter.setAllowOnlyPost(true);
    return filter;
}
作者: smartwjw 发布者: 23.04.2016 03:04

4

191 作者的声誉

只是为了澄清几点,并在Pratik Shah(以及Alex在相关主题中)提供的答案中添加更多信息:

1- configure通过创建扩展的类来覆盖所提到的方法AuthorizationServerConfigurerAdapter

    @EnableAuthorizationServer
    @Configuration
    public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {

        @Override
        public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
            oauthServer.tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()");
        }

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws     Exception {
            clients
                    .inMemory()
                    .withClient("ger-client-id")
                    .secret("ger-secret")
                    .authorizedGrantTypes("password")
                    .scopes("read", "write");
        }
    }

2-我建议阅读本Spring指南,解释当我们包含@EnableAuthorizationServer注释(包括AuthorizationServerConfigurerbean)时Spring Boot执行的自动配置。如果您创建一个扩展AuthorizationServerConfigurerAdapter我的上面的配置bean ,那么将禁用整个自动配置。

3-如果自动配置很适合你,并且你只想操纵对/oauth/check_token端点的访问,你仍然可以在不创建AuthorizationServerConfigurerbean的情况下这样做(因此无需以编程方式配置所有内容)。

您必须将security.oauth2.authorization.check-token-access属性添加到application.properties文件中,例如:

security.oauth2.client.client-id=ger-client-id
security.oauth2.client.client-secret=ger-secret
security.oauth2.client.scope=read,write

security.oauth2.authorization.check-token-access=permitAll()

当然,isAuthenticated()如果您愿意,可以给它一个值。

您可以将日志级别设置为DEBUG以检查是否按预期配置了所有内容:

16:16:42.763 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll()', for Ant [pattern='/oauth/check_token']

没有关于这些属性的文档,但您可以从此自动配置类中找出它们。

值得一提的最后一件事,我刚刚在spring-security-oauth项目中提交了一个问题 ; 看来,如果向请求添加尾部斜杠,则默认情况下会启用token_check功能:

$ curl localhost:8080/oauth/check_token/?token=fc9e4ad4-d6e8-4f57-b67e-c0285dcdeb58
{"scope":["read","write"],"active":true,"exp":1544940147,"authorities":["ROLE_USER"],"client_id":"ger-client-id"}
作者: Gerardo Roza 发布者: 15.12.2018 06:32
32x32