我使用CakePHP作爲後端,Angular作爲前端,而前端&後端處於不同的域,所以這基本上是CORS情況。CORS - CakePHP不接受AngularJS JSON-請求
基本上我試圖通過$ http.post發送一個表單的內容到一個Cake-API(稍後這是爲了做認證部分 - 但我失敗了)。因此,這裏是代碼:
aeapBackend.login = function(username, password) {
return $http.post(
API_URL + 'api_mobile_user/login', {
test: username,
test2: password
}
);
};
而在CakePHP中相應的API看起來是這樣的:
function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow(array('login'));
}
public function login() {
$this->response->header(array(
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Headers' => 'Content-Type'
)
);
$this->autoRender = false;
}
會發生什麼情況下一是預檢OPTIONS請求IST完成 - 這看起來相當不錯對我說:
請求報頭:
OPTIONS /api_mobile_user/login HTTP/1.1
Host: aeap.localhost
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://asf.localhost
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53
Access-Control-Request-Headers: accept, content-type
Accept: */*
Referer: http://asf.localhost/?username_input=hjk&password_input=hjgk&login_button=
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
響應頭:
HTTP/1.1 200 OK
Date: Wed, 05 Nov 2014 15:29:00 GMT
Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.5.15
X-Powered-By: PHP/5.5.15
Set-Cookie: CAKEPHP=j6st0hnq8ear2cc6psg56d6eu3; expires=Wed, 05-Nov-2014 19:29:00 GMT; Max-Age=14400; path=/; HttpOnly
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
但在實際POST請求,我得到一個狀態碼403完成:
XMLHttpRequest cannot load http://aeap.localhost/api_mobile_user/login. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://asf.localhost' is therefore not allowed access. The response had HTTP status code 403.
我怎樣才能避免這種情況?在我看來,我已經啓用了CORS對Cake ['Access-Control-Allow-Origin']的支持。在我看來,AngularJS發佈了一些額外的信息,這些信息在預檢期間未被檢查,然後被後端拒絕。
使用版本:2.5.3 CakePHP的,AngularJS:1.3.0
我在CakePHP中有0經驗,但它可以是您的服務器代碼添加標題僅在「選項」(預檢)進來時運行?另外,你發送了哪些頭文件?他們都在「默認的HTTP頭」列表或您明確配置的「內容類型」? – 2014-11-05 15:43:27
@MarvinSmit:「content-type」被明確設置('Access-Control-Allow-Headers'=>'Content-Type'),否則預檢將失敗。當我使用$ http.get時,從後端獲取數據沒有任何困難,所以我假設頭文件不僅僅是在預檢期間設置的。無論如何謝謝你的評論 - 我會仔細檢查一下。 – 2014-11-05 15:48:16
我的意思是說,一個好的CORS實現將返回一個401/403,如果一個標題是用POST發送的,而不是它的'CORS'有效標題'列表。通過預檢,您可以查看是否允許使用實際POST發送的標頭(使用「request-headers」 - >通過CORS實現以「allowed-headers」進行響應)。任何在「允許標題」或「默認HTTP標題」(根據CORS規範)之外發送的標題應該會導致「拒絕訪問」。 – 2014-11-05 15:59:57