La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso: no hay encabezado 'Access-Control-Allow-Origin'

Resuelto Andre Mendes asked hace 8 años • 27 respuestas

Recibo este error al usar ngResource para llamar a una API REST en Amazon Web Services :

XMLHttpRequest no puede cargar http://server.apiurl.com:8000/s/login?login=facebook . La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso: no hay ningún encabezado 'Access-Control-Allow-Origin' presente en el recurso solicitado. Por lo tanto, no se permite el acceso al origen 'http://localhost'. error 405

Servicio:

socialMarkt.factory('loginService', ['$resource', function ($resource) {
    var apiAddress = "http://server.apiurl.com:8000/s/login/";
    return $resource(apiAddress, {
        login: "facebook",
        access_token: "@access_token",
        facebook_id: "@facebook_id"
    }, {
        getUser: {
            method: 'POST'
        }
    });
}]);

Controlador:

[...]
loginService.getUser(JSON.stringify(fbObj)),
    function (data) {
        console.log(data);
    },
    function (result) {
        console.error('Error', result.status);
    }
[...]

Estoy usando Chrome. ¿Qué más puedo hacer para solucionar este problema?

Incluso configuré el servidor para aceptar encabezados desde el origen localhost.

Andre Mendes avatar Feb 24 '16 04:02 Andre Mendes
Aceptado

Te encuentras con problemas de CORS .

Hay varias formas de solucionar o solucionar este problema.

  1. Apague CORS. Por ejemplo: Cómo desactivar CORS en Chrome
  2. Utilice un complemento para su navegador
  3. Utilice un proxy, como nginx . Ejemplo de cómo configurar
  4. Realice la configuración necesaria para su servidor. Esto es más un factor del servidor web que ha cargado en su instancia EC2 (suponiendo que esto es lo que quiere decir con "servicio web de Amazon"). Para su servidor específico, puede consultar el sitio web enable CORS.

Más detalladamente, está intentando acceder a api.serverurl.com desde localhost . Esta es la definición exacta de una solicitud entre dominios.

Ya sea apagándolo solo para realizar su trabajo (está bien, pero la seguridad es deficiente para usted si visita otros sitios y simplemente lo deja en el camino) o puede usar un proxy que haga que su navegador piense que todas las solicitudes provienen del sitio local. host cuando en realidad tienes un servidor local que luego llama al servidor remoto.

Por lo tanto, api.serverurl.com podría convertirse en localhost:8000/api y su nginx local u otro proxy se enviará al destino correcto.


Ahora, por demanda popular, 100% más de información CORS : ¡el mismo gran sabor!


Omitir CORS es exactamente lo que se muestra para aquellos que simplemente aprenden el front-end. Ejemplo HTTP con promesas

 avatar Feb 23 '2016 21:02

Mi "Servidor API" es una aplicación PHP, así que para resolver este problema encontré la siguiente solución que funciona:

Coloque estas líneas en el archivo index.php :

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
Slipstream avatar Apr 06 '2016 09:04 Slipstream