2016-07-02 49 views
0

我正在構建一個React/Express/Node應用程序,並試圖向Instagram發出AJAX請求。不幸的是,我一直運行到一個錯誤,當我這樣做:AJAX調用應該在服務器上?

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. 

但我已經把我的頭

res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, content-type, accept'); 
    res.setHeader('Access-Control-Allow-Credentials', true); 

雖然我曾嘗試在本地做這些要求,我也已經部署了Heroku的,也試圖使用https(而不是http)url。但是,我仍然收到同樣的錯誤。

所以出於某種原因,這是不允許的。我想這是不可能的(如果是這樣,請讓我知道)。此外Instagram的對您的應用程序設置此選項:


[]禁用隱含的OAuth

禁用客戶端(隱含的)的OAuth網絡應用程序的流量。如果您選中此選項,則Instagram只會允許使用服務器端(顯式)OAuth流的授權請求來更好地保護您的應用程序。服務器端流量被認爲更安全。詳細信息請參閱身份驗證文檔。


那麼,我應該有用戶點擊一個按鈕,將請求發送給我的後端,使我的後臺Ajax請求,當我收到響應,然後給它回前端?這似乎令人費解,但上面的消息使得這聽起來像是更安全。但它需要更多的網絡請求。什麼是最好的?

+0

最後一段描述瞭如果API不支持CORS或jsonp時需要的代理。自己設置標題是沒用的...遠程服務器需要設置它們 – charlietfl

+0

最後一段是什麼? – jro

+0

您的問題的最後一段 – charlietfl

回答

0

當您請求localhost中的任何內容時,大多數瀏覽器都會忽略典型的CORS相關標頭。設置一個本地開發域(例如,通過你的/etc/hosts,例如* nix),然後嘗試再次與expressjs或Instagram的API進行通信,它應該可以工作。

通過您自己的應用程序進行代理,正如您在問題中概述的,通常僅在第三方API未在其API上設置適當的CORS相關標頭時纔有用。原因是服務器API調用(例如通過curl)不實現CORS,因此不執行預檢請求(例如OPTIONS http調用)。另一方面,瀏覽器也可以,但是當您訪問localhost域名時,它們無法正常工作。

相關問題