ruby-on-rails - headers - rack cors ruby on rails
No hay ningĂșn encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado (8)
Estoy usando omniauth-facebook con AngularJS y CORS no funciona correctamente.
Mi omniauth.rb es
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook,"xxxxx", "xxxxx",
:scope => ''email,user_birthday,read_stream'', :display => ''popup''
end
Todo funciona si lo uso como aplicación y solicitud de rieles. Pero cuando intento llamar ''http: / localhost: 3000 / users / auth / facebook "a través de Angular JS
$http.get(''/users/auth/facebook'').success(function(data, status, headers, config) {
console.log("back in success");
}).
error(function(data, status, headers, config) {
});
}
Veo el siguiente error en la consola JS
XMLHttpRequest no puede cargar https://www.facebook.com/dialog/oauth?client_id=xxxx&display=popup thday% 2Cread_stream & state = 3352c1924bdbc9277f7b1070c38d67acf79b529f198323cb. No hay ningún encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado. Por lo tanto, el origen
''http://localhost:3000''
no tiene permitido el acceso.
(La url no se muestra completamente en la consola)
Agregué la siguiente línea
config.middleware.insert_before Warden::Manager, Rack::Cors
pero también esto no funcionó.
¿Cuál es la mejor manera o cómo puedo anular los encabezados de OmniAuth?
Estoy usando Angularjs y gema devise, omniauth-facebook
Dado que se encuentra en su entorno de desarrollo, es posible que desee probar una solución alternativa, al permitir que el navegador se ejecute en un modo no seguro.
Para Chrome en Windows, desde CMD intente:
> cd C:/Program Files (x86)/Google/Chrome/Application
> chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
La --disable-web-security
le permitirá realizar solicitudes de dominio cruzado. El --user-data-dir
le permitirá abrir una nueva sesión solo para desarrollo.
¡Esto es solo una solución para tu trabajo de desarrollo ! ¡No use esto en producción o navegue a otros sitios en esta sesión!
El problema es que Javascript no puede hacer solicitudes de dominio cruzado. Esto se hace por razones de seguridad para que un script no pueda llamar a un servidor remoto y exponer datos confidenciales.
A continuación se muestra un enlace a una explicación muy buena y sencilla con algunas opciones sobre cómo solucionarlo:
http://developer.yahoo.com/javascript/howto-proxy.html
Y aquí hay una respuesta anterior que también tiene buena información:
¿Por qué veo un error de "origen no está permitido por Access-Control-Allow-Origin" aquí?
El problema es que está obteniendo los datos del sitio https
secure que es facebook en su sitio, que es http
por lo que los últimos navegadores no son compatibles con el origen de permisos cruzados.
La única solución es hacer que su sitio soporte https
.
En su ApplicationController.rb añadir
def set_access_control_headers
headers[''Access-Control-Allow-Origin''] = ''http://localhost:3000''
end
Establecer ''Access-Control-Allow-Origin'' en el servidor hará que la pista. Me gusta: ruby headers[''Access-Control-Allow-Origin''] = ''*''
En los rieles.
Para CORS tiene que incluir en la lista blanca el dominio al que desea acceder desde la solicitud de origen cruzado en el lado del servidor
headers[''Access-Control-Allow-Origin''] = ''*''
//star will allow all the domain you can specify also which url u want to access
en el lado del cliente, debe configurar el encabezado en config () como
$httpProvider.defaults.xsrfHeaderName = ''X-CSRFToken'';
$httpProvider.defaults.headers.common[''X-Requested-With''] = ''XMLHttpRequest'';
Si no tienen el conjunto de encabezados, no puede obligarlos a tener los encabezados. Tal vez debería mirar utilizando JSONP . Sin embargo, la duplicación a través del servidor no sería tan mala, ya que solo tendrá que lidiar con él una vez por visita, y es muy probable que una vez por usuario, ya que muy pocas personas eliminan las cookies.
algunas veces ese problema ocurre debido a browser.IE por defecto permite la solicitud de origen cruzado. En Chrome, deberá agregar un complemento que sea "Allow-Control-Allow-Origin: *" y habilitarlo.