В запрошенном ресурсе нет заголовка "Access-Control-Allow-Origin"
Я использую omniauth-facebook с AngularJS, и CORS работает неправильно.
Мой omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook,"xxxxx", "xxxxx",
:scope => 'email,user_birthday,read_stream', :display => 'popup'
end
Все работает, если я использую его как приложение и запрос rails. Но когда я пытаюсь вызвать "http:\localhost: 3000\users\auth\facebook" через Angular JS
$http.get('/users/auth/facebook').success(function(data, status, headers, config) {
console.log("back in success");
}).
error(function(data, status, headers, config) {
});
}
Я вижу следующую ошибку в консоли JS
XMLHttpRequest не может загрузить https://www.facebook.com/dialog/oauth?client_id=xxxx&display=popup... thday% 2Cread_stream & state = 3352c1924bdbc9277f7b1070c38d67acf79b529f198323cb. Нет заголовка "Access-Control-Allow-Origin" в запрошенном ресурс. Происхождение 'http://localhost:3000'
поэтому не допускается доступ.
(URL не отображается полностью в консоли)
Я добавил следующую строку
config.middleware.insert_before Warden::Manager, Rack::Cors
но и это не сработало.
Каков наилучший способ или как переопределить заголовки для OmniAuth?
Я использую Angularjs и gem devpose, omniauth-facebook
Ответы
Ответ 1
Поскольку вы находитесь в своей среде разработки, вы можете попробовать обходной путь, разрешив браузеру работать в ненадежном режиме.
Для Chrome в Windows, из CMD попробуйте:
> cd C:\Program Files (x86)\Google\Chrome\Application
> chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
Флаг --disable-web-security
позволит вам выполнять перекрестные запросы домена. Флаг --user-data-dir
позволит вам открыть новый сеанс только для разработки.
Это просто обходной путь для вашей разработки! Не используйте это на производстве или перейдите на другие сайты в этом сеансе!
Ответ 2
Проблема заключается в том, что Javascript не может выполнять междоменные запросы. Это делается по соображениям безопасности, поэтому script не может вызывать удаленный сервер и предоставлять конфиденциальные данные.
Ниже приведена ссылка на очень хорошее и простое объяснение с помощью нескольких опций о том, как обойти это:
http://developer.yahoo.com/javascript/howto-proxy.html
И вот предыдущий ответ, в котором есть и хорошая информация:
Почему я вижу, что источник не разрешен Access-Control-Allow-Origin " здесь ошибка?
Ответ 3
Если у них нет набора заголовков, вы не можете заставить их иметь заголовки. Возможно, вам стоит воспользоваться JSONP. Тем не менее, зеркалирование через сервер будет не так уж плохо, так как вам придется иметь дело с ним не чаще одного раза за посещение, и, что более чем вероятно, один раз для пользователя, так как мало кто когда-либо удаляет файлы cookie.
Ответ 4
Установите "Access-Control-Allow-Origin" на сервере, чтобы сделать трек.
Подобно:
ruby
headers['Access-Control-Allow-Origin'] = '*'
В рельсах.
Ответ 5
Проблема заключается в том, что вы получаете данные с защищенного сайта https
, который является facebook на вашем сайте, который равен http
, поэтому последние браузеры не поддерживают cross allow origin.
Единственное решение - поддерживать ваш сайт https
.
Ответ 6
В приложении ApplicationController.rb добавьте
def set_access_control_headers
headers['Access-Control-Allow-Origin'] = 'http://localhost:3000'
end
Ответ 7
Для CORS вам нужно присвоить белый список домену, к которому вы хотите получить доступ, с запросом на перекрестный поиск на стороне сервера.
headers['Access-Control-Allow-Origin'] = '*'
//star will allow all the domain you can specify also which url u want to access
на стороне клиента, вы должны установить заголовок в config() как
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
Ответ 8
несколько раз эта проблема возникает из-за браузера .IE по умолчанию разрешает запрос на перекрестный поиск. В chrome вам нужно будет добавить один плагин с надписью "Allow-Control-Allow-Origin: *" и включить его.