如何在Spring Security OAuth2中生成没有client_secret的令牌

时间:2016-08-29 10:00:46

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

我有一个基于Spring Security OAuth 2.0的应用程序,配置了JDBC和LDAP。根据OAuth 2.0规范,客户端密钥必须。

当我使用以下URL生成令牌时,它会生成令牌并正常工作:

/oauth/token?grant_type=password&client_secret=test&client_id=test&username=test&password=test

当我尝试生成没有client_secret的令牌时,它会给出:

  

401:未经授权

     

error_description:“糟糕的用户凭据”

但我想生成不带client_secret的令牌,如:

/oauth/token?grant_type=password&username=test&password=test

securityConfig.java

 @Configuration
 @EnableWebSecurity
 @EnableGlobalMethodSecurity( prePostEnabled = true )
 public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter                               {

    private static final int EMBEDDED_LDAP_SERVER_PORT = 33388;

    @Autowired
    private UserAuthenticationProvider userAuthenticationProvider;    

    @Autowired
    private LdapAuthenticationProvider ldapAuthenticationProvider;

    @Autowired
    private AuthTokenStore oAuthTokenStore;     

    @Autowired
    private AuthDelegatingAuthenticationEntryPoint  delegatingAuthenticationEntryPoint;

    @Override
    @Qualifier("authenticationManagerBean")
    @Bean
    protected AuthenticationManager authenticationManager() throws Exception {
        return new ProviderManager(Arrays.asList((AuthenticationProvider) ldapAuthenticationProvider,userAuthenticationProvider));
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {      
         http
             .csrf().disable()
             .sessionManagement()
                  .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                  .and()
             .authorizeRequests()
                  .anyRequest().authenticated()
                  .and()
             .exceptionHandling().authenticationEntryPoint(delegatingAuthenticationEntryPoint);
    }

    @Bean
    public ResourceServerTokenServices tokenService() {

        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setTokenStore(oAuthTokenStore);
        tokenServices.setReuseRefreshToken(true);
        return tokenServices;
    }

1 个答案:

答案 0 :(得分:-1)

不幸的是,没有简单的解决方法。 Spring安全性非常严格地解释标准:

这是来自OAuth2规范的引用,RFC 6749, section 4.3.2 (Resource Owner Password Credentials Grant - Access Token Request)

  

如果客户类型是保密的或客户是发给客户的   凭证(或指定的其他认证要求),
  客户端必须按授权服务器进行身份验证,如上所述   在第3.2.1节中。

对于spring security,密码授予始终属于此类别。第3.2.1节要求客户端ID和客户端密码。

Spring安全文档也是这样的: 28.1.1 Authorization Server

除非您想更改spring security的OAuth2(不推荐)的身份验证逻辑,否则您将被卡住。

从我的观点来看,没有问题。客户端ID和密码无需任何成本,并为您的应用程序带来更多安全性。