1

良い一日、春ブーツOAuth2Client私が実行されたスプリングブートアプリを持っている

Facebookのログインを扱います。その機能の基本 - "login/facebook" GETリクエストを処理し、適切なログインを行います。リクエストが同じドメインから送信された場合(例:http://localhost:8080/helpページ)、正常に動作します。

それは方法で実装されている:

@Configuration 
@EnableOAuth2Client 
public class SclLoginSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private OAuth2ClientContext oauth2ClientContext; 

    @Bean 
    public FilterRegistrationBean oauth2ClientFilterRegistration(
      OAuth2ClientContextFilter filter) { 
     FilterRegistrationBean registration = new FilterRegistrationBean(); 
     registration.setFilter(filter); 
     registration.setOrder(-100); 
     return registration; 
    } 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class) 
       .antMatcher("/**") 
       .authorizeRequests() 
       .antMatchers("/", "/login/**", "/help").permitAll() 
       .anyRequest().authenticated().and() 
       .exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/")).and() 
       .logout().logoutSuccessUrl("/").and() 
       .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); 
    } 

    @Bean 
    @ConfigurationProperties("facebook") 
    public ClientResources facebook() { 
     return new ClientResources(); 
    } 

    private Filter ssoFilter() { 
     CompositeFilter filter = new CompositeFilter(); 
     List<Filter> filters = new ArrayList<>(); 
     filters.add(ssoFilter(facebook(), "/login/facebook")); 
     //add more authorization servers here 
     filter.setFilters(filters); 
     return filter; 
    } 

    private Filter ssoFilter(ClientResources client, String path) { 
     OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(path); 
     OAuth2RestTemplate template = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext); 
     filter.setRestTemplate(template); 
     filter.setTokenServices(new UserInfoTokenServices(
       client.getResource().getUserInfoUri(), client.getClient().getClientId())); 
     return filter; 
    } 

    class ClientResources { 
     @NestedConfigurationProperty 
     private AuthorizationCodeResourceDetails client = new AuthorizationCodeResourceDetails(); 

     @NestedConfigurationProperty 
     private ResourceServerProperties resource = new ResourceServerProperties(); 

     public AuthorizationCodeResourceDetails getClient() { 
      return client; 
     } 

     public ResourceServerProperties getResource() { 
      return resource; 
     } 
    } 
} 

CORSフィルタが存在し、ように実装:他に

facebook.client.client-id=... 
facebook.client.client-secret=... 
facebook.client.access-token-uri=https://graph.facebook.com/oauth/access_token 
facebook.client.user-authorization-uri=https://www.facebook.com/dialog/oauth 
facebook.client.token-name=oauth_token 
facebook.client.authentication-scheme=query 
facebook.client.client-authentication-scheme=form 
facebook.resource.user-info-uri=https://graph.facebook.com/me 

:フェイスブックに関連

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
public class CORSFilter implements Filter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse response = (HttpServletResponse) res; 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
     chain.doFilter(req, res); 
    } 

    public void init(FilterConfig filterConfig) {} 

    public void destroy() {} 

} 

アプリケーションプロパティ側 - 私はプレゼンテーション層(反応+ axiousアプリ)を開発しています。ホストは:、私はGETを "http://localhost:8080/login/facebook"に電話し、facebookのログインページにリダイレクトするつもりだったが、これは決して起こらなかった。代わりに、私は、ブラウザで取得しています:

XMLHttpRequest cannot load https://www.facebook.com/dialog/oauth?client_id=...&redirect_uri=http://localhost:8080/login/facebook&response_type=code&state=335Pc0. Redirect from 'https://www.facebook.com/dialog/oauth?client_id=...&redirect_uri=http://localhost:8080/login/facebook&response_type=code&state=335Pc0' to 'https://www.facebook.com/login.php?skip_api_login=1&api_key=..._&display=page&locale=en_US&logger_id=13caa792-a9a9-4187-bdb3-732702703d31' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 

同時に、春のブート側からのログ:

[nio-8080-exec-4] o.s.s.web.DefaultRedirectStrategy  : Redirecting to 'https://www.facebook.com/dialog/oauth?client_id=...&redirect_uri=http://localhost:8080/login/facebook&response_type=code&state=335Pc0' 

は、誰かがこのユースケースを有効にする方法について助言することはできますか?

は本当に注意して答えを感謝し、

Vitaliy

答えて

関連する問題