2015-11-24 5 views
6

Ich habe ein CORS-Problem, wenn ich versuche, mich bei meinem Spring-Server zu authentifizieren, der den "oauth/token" -Endpunkt aufruft. Der Server antwortet mit einer 401-AntwortCORS-Fehler mit OAuth-Authentifizierung im Spring-Server

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. 

Dies ist, wie ich rufen Sie den Server:

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 die Antwort in dieser Frage gefolgt (Add headers to oauth/token response (spring-security)), aber Mein Problem ist, dass, egal wie ich meine Filter-Klasse konfiguriere, diese Funktionen nie aufgerufen werden, selbst wenn ich die höchste Priorität mit @Order-Annotation eingestellt habe .

+0

ich mit dem exakt gleichen Problem bin steckt ... Haben Sie haben einen Workaround gefunden? –

Antwort

0

Access-Control-Allow-Origin ist redundant auf die Anfrage. Das ist ein Antwort-Header.

In der verknüpften Antwort, ändern Sie den Teil zu: response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Authorization, Accept, Content-Type"); Diese Änderung Listen erlaubt Header-Werte in der Anforderung zum Server senden.

Ich bin unsicher für Ihre Frühjahr Sicherheitskonfiguration, aber Sie sollten grundsätzlich OPTIONS Anfrage auf diesem Endpunkt ohne Authentifizierung zulassen.

Viel Glück.

+0

Ich weiß, dass Header in der Anfrage nutzlos ist, aber ich habe das Unmögliche versucht, damit es funktioniert ... Mein Problem mit dem, was Sie vorschlagen, ist, dass meine benutzerdefinierte Filterklasse, die javax.servlet.Filter implementiert, nie aufgerufen wird Ich rufe den OAuth/Token-Endpunkt an, selbst wenn ich gebe, hat die maximale Priorität mit der @Order-Annotation. – sangra4l

+0

Es ist aufgrund Ihrer Frühjahr Sicherheitskonfiguration: es erfordert offenbar Authentifizierung für jeden Anruf, wo es 'OPTIONS' Anfrage ermöglichen sollte. – bekce

0

Un-Kommentar cors in 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 

dies für mich gearbeitet, wenn ich die gleichen Fehler aufwies, wurde