2015-11-24 5 views
6

Mam problem z CORS, gdy próbuję uwierzytelnić się na serwerze wiosennym wywołując punkt końcowy "oauth/token". Odpowiedzi serwerowe o reakcji 401Awaria CORS z uwierzytelnianiem OAuth na serwerze Spring

XMLHttpRequest cannot load http://localhost:8080/oauth/token. 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:8000' is therefore not allowed access. 
The response had HTTP status code 401. 

To jest jak zgłoszę serwer:

login: function(credentials) { 
     var data = "username=" + encodeURIComponent(credentials.username) + "&password=" 
      + encodeURIComponent(credentials.password) + "&grant_type=password&scope=read%20write&" + 
      "client_secret=mySecretOAuthSecret&client_id=awhyapp"; 
     return $http.post('http://localhost:8080/oauth/token', data, { 
      headers: { 
       "Content-Type": "application/x-www-form-urlencoded", 
       "Accept": "application/json", 
       "Access-Control-Allow-Origin": "*", 
       "Authorization": "Basic " + Base64.encode("awhyapp" + ':' + "mySecretOAuthSecret") 
      } 
     }).success(function (response) { 
      var expiredAt = new Date(); 
      expiredAt.setSeconds(expiredAt.getSeconds() + response.expires_in); 
      response.expires_at = expiredAt.getTime(); 
      localStorageService.set('token', response); 
      return response; 
     }); 

OauthConfigurations:

@Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
      .antMatchers(HttpMethod.OPTIONS, "/oauth/token").permitAll() 
     .and() 
      .exceptionHandling() 
      .authenticationEntryPoint(authenticationEntryPoint) 
     .and() 
      .logout() 
      .logoutUrl("/api/logout") 
      .logoutSuccessHandler(ajaxLogoutSuccessHandler) 
     .and() 
      .csrf() 
      .requireCsrfProtectionMatcher(new AntPathRequestMatcher("/oauth/authorize")) 
      .disable() 
      .headers() 
      .frameOptions().disable() 
     .and() 
      .authorizeRequests() 
      .antMatchers("/api/authenticate").permitAll() 
      .antMatchers("/api/register").permitAll() 
      .antMatchers("...").permitAll() 
    } 
} 

i następnie odpowiedź na to pytanie (Add headers to oauth/token response (spring-security)), ale moim problemem jest to, że bez względu na to, jak skonfigurować moją klasę Filter, te funkcje nigdy nie są wywoływane, nawet jeśli ustawiłem najwyższy priorytet za pomocą adnotacji @Order .

+0

utknąłem z dokładnie tej samej kwestii ... Czy znalazłeś obejście? –

Odpowiedz

0

Access-Control-Allow-Origin jest zbędny na żądanie. To jest nagłówek odpowiedzi.

W połączonej odpowiedzi zmień część na: response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Authorization, Accept, Content-Type"); Ta zmiana wyświetla dozwolone wartości nagłówków w żądaniu wysyłanym do serwera.

Nie jestem pewien co do konfiguracji zabezpieczeń wiosennych, ale w zasadzie powinieneś zezwolić na to, aby to urządzenie końcowe działało bez uwierzytelnienia.

Powodzenia.

+0

Wiem, że nagłówek jest bezużyteczny w żądaniu, ale próbowałem niemożliwe, aby to działało ... Mój problem z tym, co sugerujesz, że moja niestandardowa klasa Filter, która implementuje javax.servlet.Filter, nigdy nie jest wywoływana, gdy nawiązuję połączenie z punktem końcowym oauth/token, nawet jeśli podaję to najwyższy priorytet z adnotacją @Order. – sangra4l

+0

Spowodowane jest to twoją wiosenną konfiguracją zabezpieczeń: najwyraźniej wymaga uwierzytelnienia dla każdego połączenia, gdzie powinno zezwolić na żądanie "OPCJE". – bekce

0

Un-komentarz Cors w application.yml

cors: #By default CORS are not enabled. Uncomment to enable. 
     allowed-origins: "*" 
     allowed-methods: GET, PUT, POST, DELETE, OPTIONS 
     allowed-headers: "*" 
     exposed-headers: 
     allow-credentials: true 
     max-age: 1800 

ten pracował dla mnie, gdy miałem ten sam błąd

Powiązane problemy