поэтому я создаю расширение 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. Поэтому я предполагаю, что мой запрос на вход выполняется не из моего расширения, а из содержимого веб-сайта. Есть ли какая-либо связь, возможная из сценария, введенного в сценарий?
Было бы хорошо, если бы это было так легко ... Мой раздел разрешений включал оба ** "http: // */*" ** и ** "https: // */*" **, поэтому он должен работать. - @haibaraAi –
@ NikasŽalias, вам лучше поместить ваш вызов ajax в фоновый скрипт, который не будет заблокирован политикой одного происхождения, если вы объявили разрешения. Вы можете ознакомиться с официальным руководством [Message Passing] (https://developer.chrome.com/extensions/messaging) для получения дополнительной информации об общении между сценариями контента и фоновой страницей. –