2013-04-16 10 views
8

Próbuję wykonać pobieranie z backbone.js na mój serwer node.js. Jednak pojawia się następujący błąd w konsoli:Początek http: // localhost jest niedozwolony przez Access-Control-Allow-Origin

Origin http://localhost is not allowed by Access-Control-Allow-Origin.

I dodaje następujące do mojego serwera node.js:

var allowCrossDomain = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', "http://localhost"); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type'); 
}; 

app.configure(function() { 
    app.use(allowCrossDomain); 
}); 

ale to wciąż powraca ten sam błąd. Jednak nawet jeśli to zadziałało, nie wydaje się to idealnym rozwiązaniem, ponieważ chciałbym, aby użytkownicy z całego świata mogli wysyłać żądania.

+0

Możesz użyć „* "zamiast http: // localhost w tym przypadku. Nie jestem jednak zaznajomiony z Węzłem, więc nie wiem, czy to jest odpowiedź, czy też jest to problem konfiguracyjny. – ryanday

+0

Sprawdź, czy to pomaga http://stackoverflow.com/questions/15534640/ajax-origin-localhost-is-not-ileded-by-acontrol-allow-origin/15537999#15537999 – PSL

+0

@generalhenry Mylisz się. ['http: // localhost' jest poprawny] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) i powinieneś usunąć swój komentarz, aby uniknąć nieporozumień. – DanFromGermany

Odpowiedz

11

Jeśli chcesz, aby wszyscy byli w stanie uzyskać dostęp do aplikacji węzła następnie spróbuj użyć

res.header('Access-Control-Allow-Origin', "*") 

To pozwoli żądania od dowolnego pochodzenia. Witryna CORS enable zawiera wiele informacji na temat różnych nagłówków Allow-Control-Allow i ich używania.

Używam przeglądarki Chrome, proszę spojrzeć na this bug bug dotyczący localhost i Access-Control-Allow-Origin. Istnieje inny numer StackOverflow question here, który szczegółowo opisuje ten problem.

+0

Czy jest to bezpieczny sposób na zrobienie tego? Znalazłem [to] (https://github.com/thomasdavis/backbonetutorials/blob/gh-pages/examples/cross-domain/server.js) dotyczące rzeczy węzłowych, szkieletowych i między domenami. I działa, ale co jakiś czas wyrzuci 404, co moim zdaniem może mieć coś wspólnego z błędem chrome. –

+1

Mylące byłoby nazywanie tej metody "bezpieczną", jednak użyłem jej wcześniej w sytuacjach, w których każde żądanie AJAX nosi swój własny token uwierzytelniający. CORS ma zapobiegać złośliwemu ludowi przed oszustwami przeglądarki użytkownika do uzyskiwania dostępu do poufnych informacji z aplikacji. Powinieneś, najlepiej, dodać nagłówek dla każdej możliwej legalnej lokalizacji, z której może być obsługiwana twoja aplikacja szkieletowa. – ryanday

+0

Świetnie, dzięki za pomoc! –

0

Jeśli wykonujesz wywołanie pobierania do lokalnego hosta, które, jak przypuszczam, jest uruchamiane przez node.js w tym samym katalogu, co twój kod szkieletowy, najprawdopodobniej będzie to http://localhost:3000 lub coś w tym stylu. Niż powinien to być model:

var model = Backbone.Model.extend({ 
    url: '/item' 
}); 

iw swoim node.js masz teraz przyjąć to wezwanie takiego:

app.get('/item', function(req, res){ 
    res.send('some info here'); 
}); 
0

Istnieją 2 połączenia, które wymagają ustawienia poprawnych nagłówków. Początkowo jest sprawdzenie przed lotem więc trzeba coś ...

app.get('/item', item.list); 
app.options('/item', item.preflight); 

a następnie mają następujące funkcje ...

exports.list = function (req, res) { 
Items.allItems(function (err, items) { 
    ... 
     res.header('Access-Control-Allow-Origin', "*");  // TODO - Make this more secure!! 
     res.header('Access-Control-Allow-Methods', 'GET,PUT,POST'); 
     res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept'); 
     res.send(items); 
     } 
    ); 
}; 

i dla inspekcji wstępnej kontroli

exports.preflight = function (req, res) { 
Items.allItems(function (err, items) { 
     res.header('Access-Control-Allow-Origin', "*");  // TODO - Make this more secure!! 
     res.header('Access-Control-Allow-Methods', 'GET,PUT,POST'); 
     res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept'); 
     res.send(200); 
    } 
); 
}; 

Możesz skonsolidować kod res.header() w jedną funkcję, jeśli chcesz.

Ponadto, jak wspomniano powyżej, należy zachować ostrożność, używając res.header ("Access-Control-Allow-Origin", "*") oznacza to, że każdy może uzyskać dostęp do Twojej witryny!

0

Przez localhost musisz użyć źródła null. Polecam Ci utworzyć listę dozwolonych hostów i sprawdzić nagłówek żądania Host. Jeśli jest on zawarty w liście, a następnie przez localhost odesłać e

res.header('Access-Control-Allow-Origin', "null"); 

przez inną domenę

res.header('Access-Control-Allow-Origin', hostSentByTheRequestHeader); 

jeśli nie jest zawarty na liście, a następnie odesłać nazwy serwerów hosta więc przeglądarka ukryje odpowiedź na te żądania.

Jest to o wiele bardziej bezpieczne, ponieważ przez pozwalają pochodzenia * i pozwalają poświadczenia każdy będzie w stanie na przykład kradzież dane profilu zalogowanego użytkownika, itp ...

więc podsumować tak:

if (reqHost in allowedHosts) 
    if (reqHost == "http://localhost") 
     res.header('Access-Control-Allow-Origin', "null"); 
    else 
     res.header('Access-Control-Allow-Origin', reqHost); 
else 
    res.header('Access-Control-Allow-Origin', serverHost); 

to najbezpieczniejsze rozwiązanie, jeśli chcesz zezwolić wielu innym domenom na dostęp do Twojej strony. (Myślę, że można dowiedzieć się, w jaki sposób dostać nagłówek żądania hosta i hosta serwera, node.js.)

0

Podejście to rozwiązać mój problem, aby umożliwić wielu domen

app.use(function(req, res, next) { 
     var allowedOrigins = ['http://127.0.0.1:8020', 'http://localhost:8020', 'http://127.0.0.1:9000', 'http://localhost:9000']; 
     var origin = req.headers.origin; 
     if(allowedOrigins.indexOf(origin) > -1){ 
      res.setHeader('Access-Control-Allow-Origin', origin); 
     } 
     //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020'); 
     res.header('Access-Control-Allow-Methods', 'GET, OPTIONS'); 
     res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); 
     res.header('Access-Control-Allow-Credentials', true); 
     return next(); 
    }); 
Powiązane problemy