2014-05-18 62 views
0

我正在使用服務器端的node.js和express.js以及客戶端的angular.js。我使用passport.js在服務器端設置了身份驗證。所以,當我登錄會話cookie設置,我可以通過瀏覽器訪問API沒有問題。但是當我嘗試用http請求angular.js中的api url時,我得到了「cors blocked」(是的,我做了這個)。服務器允許憑證,客戶端發送withCredentials:true。問題是什麼?Angular.js http GET請求,發送cookies的CORS問題

有趣的是服務器和客戶端甚至不在不同的域。他們都在本地主機。但是由於服務器「cors」在一開始就阻止了我,我已經啓用了cors。

所以我有服務器和客戶端在同一個域。 Corse已在服務器中啓用,但我仍無法發送我的Cookie。

Response Headers 
Access-Control-Allow-Orig... * 
Connection keep-alive 
Content-Length 33101 
Content-Type application/json 
Date Sun, 18 May 2014 15:02:41 GMT 
Etag "-796401813" 
X-Powered-By Express 
access-control-allow-cred... true 
Request Headers 
Accept application/json, text/plain, */* 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Cookie prgck=s%3AGb1ZXuD0uXHoBbFWIcrmkSFt.%2BNt0pdVa1%2BNhUNITAPOzPjmQxklPpDrdvQz%2BACj084o 
Host localhost:1212 
Origin http://localhost:8000 
Referer http://localhost:8000/app/ 
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0 
+0

它是CORS請求的原因是由於不同的端口。這不僅僅是可以導致這種情況的主機名/域。 – mscdex

+0

它也可能值得發佈您正在使用的相關Express代碼。 – mscdex

+0

Express代碼沒有太多。這是一個從mongodb發送數據的簡單路線。如果我通過瀏覽器訪問api(例如localhost/api/get),它可以正常使用身份驗證。如果我在角度http請求中使用Credentials關閉,則按預期得到401。如果我禁用身份驗證,一切都很完美因此,只有當我嘗試向請求發送cookie時纔會發生「cors block」。 – krypt

回答

1

目前尚不清楚你做你的Express服務器上的東西,而是看你的貼,看來你啓用訪問控制允許的憑據,但你沒有定義訪問控制允許來源標題。

後者對於實際啓用CORS是必需的。因此,您的Express服務器必須同時設置:

Access-Control-Allow-Origin: http://my.domain.com:8080 
Access-Control-Allow-Credentials: true; 
+0

正如我在上述評論中所述;通常情況下,客戶端和服務器之間的一切正常工作。只有當我在客戶端使用Credientials打開時,cors錯誤纔會發生。我正在使用cors中間件[這裏](https://www.npmjs.org/package/cors)允許跨域請求。 – krypt