2

현재 Oauth2 인증을위한 스프링 응용 프로그램을 만들고 있지만 사용자 정의 ClientDetailsService 구현에 문제가 있습니다.스프링 보안 OAuth2 - 사용자 지정 ClientDetailsService

클라이언트 정보가 내 앱에 저장되어 있기 때문에 일반적인 inMemory 나 jdbc clientDetailsService를 사용할 수 없으며 외부 웹 서비스에서 가져옵니다. 그러나 사용자 정의 ClientDetailService를 설정할 때 더 이상 access_confirmation 페이지를 얻지 못합니다 (빈 페이지가 나타납니다).

내가 내 응용 프로그램을 사용하지 않는 당신이 내 문제를 표시하려면하지만 공식 봄에서 바닐라 테스트 - 보안의 OAuth 프로젝트 여기 spring-security-oauth

는 애플리케이션 코드 : 당신으로

@SpringBootApplication 
@EnableResourceServer 
@RestController 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @RequestMapping("/") 
    public String home() { 
     return "Hello World"; 
    } 

    @RequestMapping(value = "/", method = RequestMethod.POST) 
    @ResponseStatus(HttpStatus.CREATED) 
    public String create(@RequestBody MultiValueMap<String, String> map) { 
     return "OK"; 
    } 

    @Configuration 
    @EnableAuthorizationServer 
    protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { 

     @Autowired 
     private AuthenticationManager authenticationManager; 

     @Override 
     public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
      endpoints.authenticationManager(authenticationManager); 
     } 

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

     public ClientDetailsService clientDetailsService() { 
      return new ClientDetailsService() { 
       @Override 
       public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException { 
        BaseClientDetails details = new BaseClientDetails(); 
        details.setClientId(clientId); 
        details.setAuthorizedGrantTypes(Arrays.asList("authorization_code")); 
        details.setScope(Arrays.asList("read, trust")); 
        details.setResourceIds(Arrays.asList("oauth2-resource")); 
        Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); 
        authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT")); 
        details.setAuthorities(authorities); 
        return details; 
       } 
      }; 
     } //*/ 


     @Override 
     public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
      // @formatter:off 

      clients.withClientDetails(clientDetailsService()); 

      /*clients.inMemory() 
       .withClient("test") 
        .authorizedGrantTypes("authorization_code") 
        .authorities("ROLE_CLIENT") 
        .scopes("read", "trust") 
        .resourceIds("oauth2-resource"); 
      //*/ 
      // @formatter:on 
     } 
    } 

} 

내 custom clientDetailsService를 추가하고 ClientDetailsServiceconfigurer 구성을 변경하여 in memory clientDetailsService 대신 설정하도록하십시오.

내 토큰을 얻으려고 할 때 사용자를 기록한 후에 내 access_confirmation 페이지가 더 이상 나타나지 않습니다.

내 문제가 발견되어 내 clientDetails의 범위 정의가 잘못되었습니다. Arrays.asList ("read", "trust") 대신에 Arrays.asList ("read, trust")가 있습니다.

내가 무엇을 놓쳤습니까? 내 custom clientDetailsService를 다른 곳에 설정해야합니까?

+1

당신이 문제에 대한 자세한 내용을 보여주고있다 스택 트레이스 나 로그 같은 추가 정보가 있습니까? –

+0

테스트 결과에 아무런 오류가 없습니다. 나는 우체부가 설정으로 토큰을 얻기 위해 시도하는 경우 - 로컬 호스트 : 8080/OAuth를/인증 URL로 권한을 부여 - 로컬 호스트 : 8080/OAuth를/토큰으로 토큰 URL - 보조금 형식으로 authorization_code I - 클라이언트 ID 로 테스트 사용자 인증 (그는 confirm_access 페이지에 가지 않았다) 후 빈 화면을 얻을 –

+0

내가이 URL을 내 브라우저에서 테스트 : http : // localhost : 8080/oauth/authorize? client_id = test & redirect_uri = http : // localhost : 8080/& response_type = code 으로 confirm_access 페이지를 가져 오지 않고 redirect-uri로 리디렉션되었습니다 (브라우저 URL의 경우 URL이 내 토큰을 가져올 수는 없지만 승인을 테스트하려면 enuogh 여야 함)) –

답변

1

지금처럼 ClientDetails의 IMPL을 변경해보십시오 :

public ClientDetailsService clientDetailsService() { 
     return new ClientDetailsService() { 
      @Override 
      public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException { 
       BaseClientDetails details = new BaseClientDetails(); 
       details.setClientId(clientId); 
       details.setAuthorizedGrantTypes(Arrays.asList("authorization_code")); 
       details.setScope(Arrays.asList("read, trust")); 
       details.setRegisteredRedirectUri(Collections.singleton("http://anywhere.com")); 
       details.setResourceIds(Arrays.asList("oauth2-resource")); 
       Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); 
       authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT")); 
       details.setAuthorities(authorities); 
       return details; 
      } 
     }; 
    } //*/ 
+0

도움을 주셔서 감사합니다. 내 고객 세부 정보의 범위에 대한 내 정의가 허위라는 내 버그를 발견했습니다. Arrays.asList ("read", "trust") 대신에 Arrays.asList ("read, trust")가 있습니다. –

+0

니스! 내가 C/P뿐만 아니라 오타를 눈치 채지 못했습니다 :) – vmarusic