2016-03-30 2 views
2

поэтому я создаю расширение Google Chrome, и сначала я вводил свои html, угловые и javascripts через скрипт контента. Нет, мне нужно вводить его самостоятельно. Я сделал это! Но проблема в том, что когда она была введена через скрипт контента, мой метод входа в систему работал отлично, я получил токен (это то, что мне было нужно), но когда я сам ввел его, моя функция входа в систему больше не работает, и она вызывает эту ошибку:

XMLHttpRequest cannot load http://www.cheapwatcher.com/api/Authenticate . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://anywebsitename.com ' is therefore not allowed access. The response had HTTP status code 400.

Это мой метод Логин (я ничего не изменилось с тех пор изменили тип впрыска):

angular.module('app').controller('LoginController', LoginController); 

LoginController.$inject = ['$scope', '$http', '$location', '$state']; 

function LoginController($scope, $http, $location, $state) { 
    $scope.login = function (user) { 
     user.grant_type = 'password'; 
     return $http({ 
      method: 'POST', 
      url: 'http://www.cheapwatcher.com/api/Authenticate', 
      headers: { 
       'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 
       'Access-Control-Allow-Origin': '*' 
      }, 
      transformRequest: function (obj) { 
       var str = []; 
       for (var p in obj) 
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
       return str.join("&"); 
      }, 
      data: user 
     }).success(function (result) { 
      console.log(result); 
      $(".cheap-watcher").fadeOut(1500, function() {       
       $(".cheap-watcher").fadeIn($state.go("logout"), {}, { location: false }).delay(2000); 
      }) 
     }).error(function (result) { 
      console.log(result); 
     });  
    }; 
}; 

Могу ли я сделать что-то, не делая CORS на стороне сервера? Потому что, как я сказал, инъекция через скрипт контента работает просто отлично

UPDATE!

Таким образом, я изменил свой метод входа с $ http на $ .ajax. Все так же, как и вместо $ http, я написал раздел $ .ajax и удаленные заголовки. В управлении источником хром ошибка такая же, но теперь в скрипке я вижу, что мой запрос был успешным. Как это возможно?

Теперь войдите метод выглядит следующим образом:

angular.module('app').controller('LoginController', LoginController); 

LoginController.$inject = ['$scope', '$http', '$location', '$state']; 

function LoginController($scope, $http, $location, $state) { 
    $scope.login = function (user) { 
     user.grant_type = 'password'; 
     return $.ajax({ 
      url: "http://www.cheapwatcher.com/api/Authenticate", 
      crossDomain: true, 
      contentType: 'application/x-www-form-urlencoded; charset=UTF-8', 
      method: 'POST', 
      transformRequest: function (obj) { 
       var str = []; 
       for (var p in obj) 
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
       return str.join("&"); 
      }, 
      data: user 
     }).success(function (result) { 
      console.log(result); 
      $(".cheap-watcher").fadeOut(1500, function() { 
       $(".cheap-watcher").fadeIn($state.go("logout"), {}, { location: false }).delay(2000); 
      }) 
     }).error(function (result) { 
      console.log(result); 
     }); 
    }; 
}; 

UPDATE NR. 2!

Я видел, что ошибка исходит от индексной страницы http://anywebsitename.com. Поэтому я предполагаю, что мой запрос на вход выполняется не из моего расширения, а из содержимого веб-сайта. Есть ли какая-либо связь, возможная из сценария, введенного в сценарий?

ответ

1

Посмотрите Requesting cross-origin permissions, вы можете добавить http://www.cheapwatcher.com/api/Authenticate в permissions разделы.

By adding hosts or host match patterns (or both) to the permissions section of the manifest file, the extension can request access to remote servers outside of its origin.

+0

Было бы хорошо, если бы это было так легко ... Мой раздел разрешений включал оба ** "http: // */*" ** и ** "https: // */*" **, поэтому он должен работать. - @haibaraAi –

+0

@ NikasŽalias, вам лучше поместить ваш вызов ajax в фоновый скрипт, который не будет заблокирован политикой одного происхождения, если вы объявили разрешения. Вы можете ознакомиться с официальным руководством [Message Passing] (https://developer.chrome.com/extensions/messaging) для получения дополнительной информации об общении между сценариями контента и фоновой страницей. –

0

Чтобы использовать CORS внутри Angular, нам нужно указать Angular, что мы используем CORS. Мы используем метод .config() на нашем модуле «Угловой модуль», чтобы задать два варианта.

  1. Мы должны сказать Угловая использовать XDomain и
  2. Мы должны удалить X-Requested-With заголовком от всех наших запросов

    angular.module('myApp') 
    .config(function($httpProvider) { 
        $httpProvider.defaults.useXDomain = true; 
        delete $httpProvider.defaults.headers 
          .common['X-Requested-With']; 
    }); 
    
+0

_XMLHttpRequest не может загрузить http: //www.cheapwatcher .com/API/Аутентифицировать. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Происхождение «http://anywebsitename.com», следовательно, не разрешено access._ по-прежнему та же ошибка - @adityasingh –

+0

Позволяет ли ваш сервер запрашивать из этого домена? –

+0

Да, это позволяет - @AdityaSingh –

Смежные вопросы