2014-06-23 12 views
5

Mam problemy z włączeniem CORS na moim serwerze w połączeniu z AngularJS. Używam kątowej 1.2.16 i to jest mój serwer config:Żądanie niestandardowego nagłówka AngularJS CORS

Header set Access-Control-Allow-Origin "*" 
Header set Access-Control-Allow-Headers "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name, Authorization" 
Header set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS" 
Header set Access-Control-Allow-Credentials "true" 

mogę użyć następującego wniosku:

$http.post(configuration.authUrl, {username: 'username', password: 'password'}) 
    .success(function (data) { 
     $cookieStore.put(configuration.sessionName, { 
      token: data.authenticationToken, 
       user: data.user 
     }); 
    }) 
    .error(function() {})); 

ponieważ wniosek ten nie korzysta z niestandardowego nagłówka.

Kiedy potem spróbować poprosić następujące: Balance.get() z równowagi bytu:

angular.module('portalApp') 
    .factory('Balance', ['$resource', 'Auth', 'configuration', function ($resource, Auth, configuration) { 
     return $resource(configuration.balanceUrl, {}, { 
      get: { 
       method: 'GET', 
       isArray: false, 
       headers: { 
        Authorization: Auth.getAuthToken() 
       } 
      } 
     }); 
    }]); 

dostaję 401 Unauthorized na balanceUrl.

w config Włożyłem:

$httpProvider.defaults.useXDomain = true; 
delete $httpProvider.defaults.headers.common['X-Requested-With']; 

Próbowałem nawet wprowadzenie $http.defaults.headers.common.Authorization = Auth.getAuthToken(); przed $resource w fabryce Resource Balance ale to nie pomogło.

Nagłówki wysyłane na żądanie preflight OPTIONS nie zawierają nagłówka Authorization, niezależnie od używanej metody. Są to nagłówki żądań żądania preflight OPTIONS.

OPTIONS /api/v1.0/user/orders HTTP/1.1 
Host: host 
Connection: keep-alive 
Cache-Control: no-cache 
Access-Control-Request-Method: GET 
Pragma: no-cache 
Origin: origin 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 
Access-Control-Request-Headers: accept, authorization 
Accept: */* 
Referer: referer 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

Wszelkie sugestie?

Odpowiedz

3

Po wielu badaniach odkryłem, że problem nie występował z powodu konfiguracji AngularJS lub Apache. Był to problem w aplikacji serwera zaplecza (Java). Adresy URL były ograniczone do wszystkich metod HTTP, więc gdy AngularJS chce wykonać żądanie preflight OPTIONS, odmówiono dostępu i zwrócono 401.

ta została ustalona przez robi:

if(!authenticationService.isTokenValid(glueToken) && !((HttpServletRequest)servletRequest).getMethod().equals(HttpMethod.OPTIONS.toString())){ 
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
} else { 
    filterChain.doFilter(servletRequest, servletResponse); 
} 

W zastępstwie:

if(!authenticationService.isTokenValid(glueToken)){ 
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
} else { 
    filterChain.doFilter(servletRequest, servletResponse); 
} 
-1

Używam zupełnie innego podejścia, ale założenie jest wciąż takie samo.

Najpierw spróbuj umieścić na okaziciela przed token dostępu:

headers: { 
    Authorization: 'Bearer ' + Auth.getAuthToken() 
} 

Jeśli nie spróbuj tego: app.config nie może działać, jeśli nie masz app skonfigurować jako zmienna, więc może trzeba dostosować.

app.config(
    function($httpProvider) { 
     $httpProvider.defaults.headers.common = {}; 
     $httpProvider.defaults.headers.post = {}; 
     $httpProvider.defaults.headers.put = {}; 
     $httpProvider.defaults.headers.patch = {}; 

     $httpProvider.defaults.headers.common.Authorization = 'Bearer ' + Auth.getAuthToken(); 
    } 
); 
3

Ponieważ wiem, że nie można używać Access-Control-Allow-Origin "*" z Access-Control-Allow-Credentials "true".

+0

Tak, nie możesz, http: // stackoverflow.com/a/19744754/101662 – Oliver

Powiązane problemy