2014-10-29 1 views
2

Извините за еще один вопрос об Угловом и CORS, но я просто не могу определить, где находится проблема. Моя базовая настройка - это простой угловой автономный веб-сайт, поэтому нет Express или любого серверного компонента, который говорит о Java-API на другом сервере. API построен с использованием JAX-RS и живет на сервере приложений JBoss 7.1.3. У меня есть доступ к коду как для угловой, так и для java.AngularJS CORS с заголовком авторизации

С API-интерфейсом CORS разрешен с использованием популярного фильтра трансляции CORS, показанного ниже.

<filter> 
    <filter-name>CORS</filter-name> 
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> 
    <init-param> 
     <param-name>cors.supportedMethods</param-name> 
     <param-value>GET, POST, HEAD, PUT, DELETE, OPTIONS</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.supportedHeaders</param-name> 
     <param-value>Origin, Accept, Content-Type, X-Requested-With, Cookie,content-type</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CORS</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Путем API работает, обеспечивая имя пользователя и пароль для доступа к конечной точке, которая возвращает маркер, этот маркер затем включаются в заголовке авторизации в каждом последующем запросе. Первая часть процесса работает нормально, я могу предоставить действительные учетные данные и получить токен, но затем любой последующий запрос никогда не работает. Таким образом, в моем Угловом сервисе у меня есть следующий метод входа, который извлекает мне токен, а затем пытается получить текущего зарегистрированного пользователя.

login: function(username, password){ 

     var deferred = $q.defer(); 

     $http({ 
      method: 'POST', 
      url: 'http://localhost:8080/website-api/rest/account/token', 
      headers: {'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, 
      transformRequest: function(obj) { 
       var str = []; 
       for(var p in obj){ 
        str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p])); 
       } 
       return str.join('&'); 
      }, 
      data: {username: username, password: password } 
     }) 
     .success(function(token) { 

      $log.info(token.jwt); 

      var requestConfig = { 
       headers: { 
        'Authorization': token.jwt, 
        'Accept': 'application/json', 
        'X-Testing': 'Testing' 
       } 
      }; 

      $http.get('http://localhost:8080/website-api/rest/users/current', requestConfig) 
       .success(function(user) { 

        $log.info('Retrieved User'); 
        user.sessionToken = token.jwt; 
        deferred.resolve(user); 

       }) 
       .error(function(data, status, headers, config) { 

        $log.info(data); 
        $log.info(status); 
        $log.info(headers); 
        $log.info(config); 
       }); 

     }) 
     .error(function(data, status, headers, config) { 

      $log.info(data); 
      $log.info(status); 
      $log.info(headers); 
      $log.info(config); 
     }); 

     return deferred.promise; 
    } 

Первый запрос работает отлично, второй завершается с ошибкой:

XMLHttpRequest cannot load http://localhost:8080/website-api/rest/users/current. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. 

Я не могу понять, если установка фильтра CORS на API является причиной моей проблемы или что-то я не делаю правильно, отправляя запрос от Angular. Я подозреваю, что это угловой, потому что я могу использовать сторонние службы Postman и Hurl.it для тестирования конечных точек API, и они возвращают объект пользователя по назначению.

Любая помощь будет очень признательна!

ответ

1

Основываясь на горбе от чтения этой post, я заметил, что не только у меня Content-Type определенных дважды в моем списке принятых заголовков, но у меня не было Authorization набора в качестве разрешенного заголовка. Фильтр CORS отклоняет любые входящие запросы, содержащие заголовки, которые не разрешены, что вызывает мою ошибку 403.