Spring Security OAuth2 check_token端点

时间:2014-11-05 06:29:35

标签: spring spring-security oauth-2.0 spring-security-oauth2

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

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

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

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

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

提前致谢,

4 个答案:

答案 0 :(得分:20)

你必须

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

有关此内容的详细信息::

How to use RemoteTokenService?

答案 1 :(得分:3)

仅需澄清几点,并为 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-我建议阅读this Spring guide来解释当我们包含@EnableAuthorizationServer注释(包括一个AuthorizationServerConfigurer bean)时Spring Boot进行的自动配置。如果您像上面一样创建了一个扩展AuthorizationServerConfigurerAdapter的配置bean,那么整个自动配置将被禁用。

3-如果自动配置非常适合您,并且您只想操纵对/oauth/check_token端点的访问,您仍然可以这样做而无需创建AuthorizationServerConfigurer bean(因此不必以编程方式配置所有内容。

您必须将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']

关于这些属性的文档很少,但是您可以从this autoconfiguration class中找出它们。

最后一件事值得一提,我刚刚在an issue项目中提交了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"}

答案 2 :(得分:1)

有3个POST参数,即client_id(用户名),client_secret(与用户名对应的密码),令牌(申请的令牌),client_id,client_secret与/ oauth / token接口中的参数不同

enter image description here

答案 3 :(得分:0)

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

@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;
}