2017-02-06 43 views
14

我試圖將請求從一個本地主機端口發送到另一個。我在前端使用angularjs,在後端上使用節點。CORS錯誤:請求標頭字段預操作響應中的Access-Control-Allow-Headers不允許授權

既然是CORS要求,在node.js中,我使用

res.header('Access-Control-Allow-Origin', '*'); 
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH'); 
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization'); 

,並在angular.js服務文件,我使用

return { 
    getValues: $resource(endpoint + '/admin/getvalues', null, { 
     'get': { 
      method: 'GET', 
      headers:{'Authorization':'Bearer'+' '+ $localStorage.token} 
      } 
    }), 
} 

我收到以下錯誤

請求標頭字段預操作響應中的Access-Control-Allow-Headers不允許授權。

請幫忙!

+0

你需要把身份驗證的服務器,並在Firefox犯規需要這個權威性 –

+0

@ÁlvaroTouzón,我把這個res.header(「訪問控制允許報頭」,「起源,X-Requested-With,Content-Type,Accept,Authorization');在服務器 –

回答

15

您必須在允許的標題中添加選項。瀏覽器在發送原始請求之前發送預檢請求。見下文

res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS'); 

從源https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS

在CORS,與OPTIONS方法預檢請求被髮送,以便服務器可以響應是否是可以接受的發送這些參數的請求。 Access-Control-Request-Method標題通知服務器作爲預檢請求的一部分,當發送實際請求時,它將使用POST請求方法發送。 Access-Control-Request-Headers標頭通知服務器,當實際請求發送時,它將與X-PINGOTHERContent-Type自定義標頭一起發送。服務器現在有機會確定它是否希望在這種情況下接受請求。

通過使用npmjs.com/package/cors NPM package.I已經用這種方法還EDITED

可以避免這種手動配置,很明顯和容易的。

+0

更改res.header('訪問控制允許方法','GET,POST,PUT,DELETE,PATCH');分辨。header('Access-Control-Allow-Methods','GET,PUT,POST,DELETE,OPTIONS');仍然不工作 –

+0

res.header('Access-Control-Expose-Headers','Authorization'); //必須公開以便瀏覽器有權訪問此標頭 – vikas

+0

解決方案我已爲我工作。它爲你工作?如果沒有,你也可以嘗試https://www.npmjs.com/package/cors。我用這個方法也很清楚和容易。 – vikas

0

如果您不想安裝cors庫,而是想修復原始代碼,那麼您缺少的另一步是Access-Control-Allow-Origin:*是錯誤的。當傳遞身份驗證令牌(例如JWT)時,您必須明確聲明每個調用您的服務器的URL。執行身份驗證令牌時不能使用「*」。

9

這是一個API問題,如果使用Postman/Fielder向API發送HTTP請求,您將不會收到此錯誤。在瀏覽器的情況下,出於安全考慮,他們總是在發送實際請求(GET/POST/PUT/DELETE)之前將OPTIONS request/preflight發送給API。因此,如果請求方法是OPTION,不僅需要將「授權」添加到「Access-Control-Allow-Headers」中,而且需要將「OPTIONS」添加到「Access-Control-allow-methods」中作爲好。這是怎麼固定:

if (context.Request.Method == "OPTIONS") 
     { 
      context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { (string)context.Request.Headers["Origin"] }); 
      context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept, Authorization" }); 
      context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" }); 
      context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); 

     } 
相關問題