2011-10-05 11 views
10

Estoy trabajando en una extensión de Chrome que rastrea el tiempo y utiliza Google App Engine para el back-end.No se puede conectar a localhost desde la extensión de Chrome

Para probar, intento conectar una versión local de la extensión a una versión local de la aplicación App Engine. Cuando intento enviar una solicitud POST, estoy recibiendo:

XMLHttpRequest cannot load http://localhost:8080/report . Origin chrome-extension://mbndmimplohfkkcincjodnfpaapbbmei is not allowed by Access-Control-Allow-Origin.

pero funciona cuando cambio la dirección URL para que se publica a la URL appspot.com.

¿Qué es Access-Control-Allow-Origin, y por qué me impide obtener los resultados de localhost?

Respuesta

16

Creo que esto se debe a que no puede hacer llamadas a un servidor que no está incluido en la sección de permisos de su manifiesto. La sección de permisos de manifest.json debería ser algo como esto:

"permissions": [ 
    "http://myapp.appspot.com/*", 
    "http://localhost/*" 
] 

Nota, no he probado esto, pero parece que es donde el problema está viniendo.

+1

Pequeña corrección. Puede realizar solicitudes incluso si no están en los permisos, pero a menos que CORS esté configurado para permitir esto en el servidor, fallará. – Xan

+0

Ya configuré el permiso para localhost pero aún no funciona. Cualquiera puede ayudar? –

2

no puede agregar puertos dentro de los permisos. Debe usar el puerto 80 para las extensiones dentro del manifiesto de permisos. Normalmente ejecuto nginx y ruteo todo el tráfico desde mis extensiones al puerto 80.

+0

Esta es mi primera extensión, por lo que no se sabe muy bien lo que estoy haciendo. ¿Como podría hacerlo? – Jeremy

+3

La respuesta aceptada es correcta. Agregué '" http: // localhost/* "' a los permisos y ahora puedo hacer un AJAX GET a: 8080. – raine

+0

Gracias @rane, es bueno saberlo. –

0

que era capaz de conseguir este código para trabajar:

var loginPayload = {}; 
loginPayload.username = document.getElementById('username').value; 
loginPayload.password = document.getElementById('password').value; 
console.log(loginPayload); 

var callback = function (response) { 
    console.log(response); 
}; 
var handle_error = function (obj, error_text_status){ 
    console.log(error_text_status + " " + obj); 
}; 

$.ajax({ 
    url: 'https://127.0.0.1:8443/hello', 
    type: 'POST', 
    success: callback, 
    data: JSON.stringify(loginPayload), 
    contentType: 'application/json', 
    error: handle_error 
}); 

EDIT:
Al parecer, alguien no le gustó esto, por lo que un par de cosas a tener en cuenta:

  1. para extensiones que tiene que funcionar en https, asegúrese de que su servidor esté sirviendo https.
  2. Contrariamente a puestos de arriba, las extensiones de Chrome puede servir en otros puertos distintos puertos 80/443
1

Usted puede puertos de uso personalizados.

manifest.json

"permissions": ["http://localhost/*"] 

background.js (utilizando jQuery)

$.post('http://localhost:5000/some-endpoint'); 
Cuestiones relacionadas