2013-01-08 92 views
33

試圖實施ajax登錄/註冊過程(無需身份驗證的刷新站點)。使用Cookie保存狀態。我認爲我現在有這個權利,但由於某種原因,瀏覽器在從服務器獲取它們之後不會設置cookie。誰能幫忙?下面是請求和響應頭:通過CORS的Ajax請求在瀏覽器上設置Cookie

Request URL:http://api.site.dev/v1/login 
Request Method:POST 
Status Code:200 OK 

請求頭

Accept:application/json, text/plain, */* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:57 
Content-Type:application/json;charset=UTF-8 
Host:api.site.dev 
Origin:http://site.dev 
Referer:http://site.dev/ 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11 
withCredentials:true 
X-Requested-With:XMLHttpRequest 
Request Payload 
{"email":"[email protected]","password":"foobar"} 

響應頭

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:X-Requested-With, Content-Type, withCredentials 
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Origin:http://site.dev 
Connection:Keep-Alive 
Content-Length:19 
Content-Type:application/json 
Date:Tue, 08 Jan 2013 18:23:14 GMT 
Keep-Alive:timeout=5, max=99 
Server:Apache/2.2.22 (Unix) DAV/2 PHP/5.4.7 mod_ssl/2.2.22 OpenSSL/0.9.8r 
Set-Cookie:site=%2B1THQQ%2BbZkEwTYFvXFVV5fxi00l2K%2B6fvt9SuHACTNsEwUGzDSUckt38ZeDsNbZSsqzHmPMWRLc84eDLZzh8%2Fw%3D%3D; expires=Thu, 10-Jan-2013 18:23:14 GMT; path=/; domain=.site.dev; httponly 
X-Powered-By:PHP/5.4.7 

我也看到在Chrome網絡工具的cookie,從返回服務器:

響應cookie

Name: site 
Value: %2B1THQQ%2BbZkEwTYFvXFVV5fxi00l2K%2B6fvt9SuHACTNsEwUGzDSUckt38ZeDsNbZSsqzHmPMWRLc84eDLZzh8%2Fw%3D%3D 
Domain: .site.dev 
Path:/
Expires: Session 
Size: 196 
Http: ✓ 
+0

這是根據RFC2109第4.3.2節的域匹配問題?我並不完全清楚您的主機(api.site.dev)和cookie域(.site.dev)是否根據需要「域匹配」。 CORS方面並沒有使這個更容易演繹:) – broofa

+0

[CORS請求 - 爲什麼cookie沒有發送?](http://stackoverflow.com/questions/8863571/cors-request - 爲什麼是cookies沒有發送) –

回答

17

你的AJAX請求必須設置爲true的「withCredentials」設置(僅XMLHttpRequest2中使用和提取)進行:

var req = new XMLHttpRequest(); 
    req.open('GET', 'https://api.bobank.com/accounts', true); // force XMLHttpRequest2 
    req.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); 
    req.setRequestHeader('Accept', 'application/json'); 
    req.withCredentials = true; // pass along cookies 
    req.onload = function() { 
     // store token and redirect 
     let json; 
     try { 
      json = JSON.parse(req.responseText); 
     } catch (error) { 
      return reject(error); 
     } 
     resolve(json); 
    }; 
    req.onerror = reject; 

如果您想對CORS,API安全,和餅乾的詳細說明,答案不適合StackOverflow評論。看看這篇文章,我寫了關於這個問題:http://www.redotheweb.com/2015/11/09/api-security.html

+1

問題: - 當憑證標誌爲真時,'Access-Control-Allow-Origin'標頭中不能使用通配符'*'。因此不允許原產地'null'訪問。 – ZiglioUK

+0

弗朗索瓦,我讀過你的文章,我正在使用一個api,這是一個web服務。它需要系統認證(不是由數據庫驅動)。我使用的憑據和能夠登錄。現在可以將此憑據存儲在Cookie中並繞過驗證。感謝文章。 –

+0

您還必須將響應頭「Access-Control-Allow-Credentials」設置爲「true」,否則瀏覽器將阻止(拒絕)請求。 – Tim

5

我有一個類似的問題,它原來的瀏覽器設置被阻斷第三方Cookie(Chrome瀏覽器>設置>高級設置>隱私設置>內容設置>阻止第三方Cookie和網站數據)。解除封鎖解決了問題!

+2

確實。由於這是Safari中的默認設置,並且在大多數其他瀏覽器中可能,因此製作網站(通過CORS依賴於第三方Cookie)應該考慮一些問題。很少有用戶可能會被告知爲網站啓用第三方Cookie。 –

+0

我剛剛花了三個小時進行故障排除並尋找支持,然後才意識到這是我的問題。謝謝! – Chris

+11

我遇到同樣的問題,但「阻止第三方Cookie和網站數據」已被禁用。 – Thayne