2017-02-14 1 views
0

春のセキュリティoauthを使用して、refresh_token操作にoauth(ベアラ)認証をバイパスまたは使用する方法はありますか? 私は成功せずに多くの構成を試しました。 現在のところ、それが動作する唯一の方法は、基本認証を使用することです。 私はこれが悪いと思うのは、クライアントにトークンを更新するためにユーザーのパスワードを保存させるからです。基本認証を持たないgrant_type refresh_token

public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter { 
    @Autowired 
    private SecurityConfig securityConfig; 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    private ClientDetailsService clientDetailsService; 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Override 
    public void configure(final ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.withClientDetails(clientDetailsService); 
    } 

    @Override 
    public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); 
     tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), jwtAccessTokenConverter())); 

     endpoints 
      .tokenStore(tokenStore()).tokenEnhancer(tokenEnhancerChain) 
      .authenticationManager(authenticationManager) 
      .userDetailsService(userDetailsService) 
      .tokenServices(tokenServices()); 
    } 

    @Bean 
    public TokenStore tokenStore() { 
     return new JwtTokenStore(jwtAccessTokenConverter()); 
    } 

    @Bean 
    protected JwtAccessTokenConverter jwtAccessTokenConverter() { 
     final KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(
      new ClassPathResource(securityConfig.getKeyResource()), securityConfig.getKeyPass().toCharArray()); 
     final JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
     converter.setKeyPair(keyStoreKeyFactory.getKeyPair(securityConfig.getKeyAlias())); 
     return converter; 
    } 

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

    @Bean 
    public TokenEnhancer tokenEnhancer() { 
     return new CustomTokenEnhancer(); 
    } 

    @Bean 
    @Primary 
    public CustomTokenServices tokenServices() { 
     final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); 
     tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), jwtAccessTokenConverter())); 

     final CustomTokenServices services = new CustomTokenServices(); 
     services.setTokenStore(tokenStore()); 
     services.setTokenEnhancer(tokenEnhancerChain); 
     services.setSupportRefreshToken(true); 
     services.setClientDetailsService(clientDetailsService); 
     addUserDetailsService(services, userDetailsService); 
     return services; 
    } 

    private void addUserDetailsService(final DefaultTokenServices tokenServices, final UserDetailsService userDetailsService) { 
     if (userDetailsService != null) { 
      final PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider(); 
      provider.setPreAuthenticatedUserDetailsService(new UserDetailsByNameServiceWrapper<PreAuthenticatedAuthenticationToken>(
       userDetailsService)); 
      tokenServices 
       .setAuthenticationManager(new ProviderManager(Arrays.<AuthenticationProvider>asList(provider))); 
     } 
    } 

} 

WebSecurityConfiguration:

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

    @Autowired 
    private ClientDetailsService clientDetailsService; 

    @Override 
    public void configure(final AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(clientDetailsUserService()); 
    } 

    @Bean 
    protected UserDetailsService clientDetailsUserService() { 
     return new ClientDetailsUserDetailsService(clientDetailsService); 
    } 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     // disable caching 
     http.headers().cacheControl(); 

     http 
      .authorizeRequests() 
      .antMatchers(HttpMethod.OPTIONS).permitAll() 
      .antMatchers(HttpMethod.POST, "/login").permitAll() 
      .anyRequest().authenticated() 
      .and().csrf().disable(); 
    } 

    @Override 
    @Bean 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

} 

答えて

0

いいえ、有効なクライアント資格情報なしアクセストークンを更新することはできません。

RFC 6749セクション1.5は言う:

(G)、クライアントが と認証サーバを認証し、リフレッシュトークンを提示することによって、新しいアクセストークンを要求します。 [...]

セキュリティおよび標準準拠の観点からは、アプリケーションでこのようなアプローチをとることはお勧めしません。

トークンをリフレッシュするためにクライアントにユーザーのパスワードを保存させるため、これは悪いと思います。

これは絶対に行わないでください。あなたのアプリケーションの設定については言及していませんが、アプリケーションには OAuth2標準に準拠するためのインフラストラクチャコードが欠けていると思います。

Spring Cloud Securityを使用することを検討してください。リソースサーバー間のトークンリレーを無料で提供し、アクセストークンのリフレッシュについて心配する必要はありません。

spring.ioのtutorialをご覧ください。