2015-06-19 3 views
1

Я пытаюсь внедрить клиента OAuth2, используя поток полномочий авторизационного кода с помощью Spring-Boot. Но это не сработает.Конфигурация клиента OAuth2 с пружинной загрузкой

«http://external_server/oauth/authorize» был вызван, но не было добавлено GET аргументов.

Кто-нибудь знает, что не так в конфигурации ниже?

Поставщик Auth реализуется doorkeeper, и он уже работает. , так что константы URL в WebSecurityConfiguration верны.

@Configuration 
@EnableWebMvcSecurity 
@EnableOAuth2Client 
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    private static final String AUTH_ENDPOINT = "http://external_server"; 
    private static final String LOGIN_URL = AUTH_ENDPOINT + "https://stackoverflow.com/users/sign_in"; 
    private static final String LOGOUT_URL = AUTH_ENDPOINT + "/sign_out"; 

    private static final String AUTH_URL = AUTH_ENDPOINT + "/oauth/authorize"; 
    private static final String ACCESS_TOKEN_URL = AUTH_ENDPOINT + "/oauth/token"; 

    @Autowired OAuth2ClientContext oAuth2ClientContext; 

    /** 
    * for specific api 
    */ 
    @Bean public RestTemplate restTemplate() { 
    return new RestTemplate(); 
    } 

    /** 
    * for accessing protected resource 
    */ 
    @Bean public OAuth2RestTemplate oAuth2RestTemplate() { 
    return new OAuth2RestTemplate(resource(), oAuth2ClientContext); 
    } 

    @Bean protected OAuth2ProtectedResourceDetails resource() { 

    AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails(); 
    resource.setClientId("_xxx_"); 
    resource.setClientSecret("_yyy_"); 
    resource.setUserAuthorizationUri(AUTH_URL); 
    resource.setAccessTokenUri(ACCESS_TOKEN_URL); 

    return resource; 
    } 

    @Override public void configure(WebSecurity web) throws Exception { 
    web.debug(true).ignoring().antMatchers("/webjars/**", "/css/**"); 
    } 

    @Override protected void configure(HttpSecurity http) throws Exception { 
    //@formatter:off 
    http.csrf().disable().authorizeRequests() 
     .antMatchers("/", "/callback") 
     .permitAll() 
     .anyRequest() 
     .authenticated(); 

    http.formLogin() 
     .loginPage(AUTH_URL) 
     .loginProcessingUrl(LOGIN_URL); 

    http.httpBasic() 
     .disable(); 
    //@formatter:on 
    } 
} 
+1

OAuth2ProtectedResourceDetails устанавливается в OAuth2RestTemplate так, что он будет знать, какой поток гранта вы хотите использовать. Как бы то ни было, вы не пользуетесь им. –

+0

@ bajada93 благодарит за ваш комментарий! Я установил класс конфигурации, чтобы ввести OAuth2RestTemplate, но все же не работает. –

+1

Вам необходимо добавить [OAuth2ClientAuthenticationProcessingFilter] (https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/ oauth2/client/filter/OAuth2ClientAuthenticationProcessingFilter.java) в цепочку фильтров Spring Security и вставить в него OAuth2RestTemplate. Это должно делать свое дело. –

ответ

0

По умолчанию включен только метод POST. Возможно, вам необходимо включить GET-метод в AuthorizationConfig.

.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST); 

будет выглядеть следующим образом:

@Configuration 
@EnableAuthorizationServer 
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 
    .... 
    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints){ 
     endpoints.authenticationManager(authenticationManager) 
       .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST); 
    } 
} 

В исходном коде Spring Oauth мы имеем:

private Set<HttpMethod> allowedTokenEndpointRequestMethods() { 
     // HTTP POST should be the only allowed endpoint request method by default. 
     if (allowedTokenEndpointRequestMethods.isEmpty()) { 
      allowedTokenEndpointRequestMethods.add(HttpMethod.POST); 
     } 
     return allowedTokenEndpointRequestMethods; 
    } 
Смежные вопросы