2014-11-05 49 views
1

我使用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

+2

我在CakePHP中有0經驗,但它可以是您的服​​務器代碼添加標題僅在「選項」(預檢)進來時運行?另外,你發送了哪些頭文件?他們都在「默認的HTTP頭」列表或您明確配置的「內容類型」? – 2014-11-05 15:43:27

+0

@MarvinSmit:「content-type」被明確設置('Access-Control-Allow-Headers'=>'Content-Type'),否則預檢將失敗。當我使用$ http.get時,從後端獲取數據沒有任何困難,所以我假設頭文件不僅僅是在預檢期間設置的。無論如何謝謝你的評論 - 我會仔細檢查一下。 – 2014-11-05 15:48:16

+1

我的意思是說,一個好的CORS實現將返回一個401/403,如果一個標題是用POST發送的,而不是它的'CORS'有效標題'列表。通過預檢,您可以查看是否允許使用實際POST發送的標頭(使用「request-headers」 - >通過CORS實現以「allowed-headers」進行響應)。任何在「允許標題」或「默認HTTP標題」(根據CORS規範)之外發送的標題應該會導致「拒絕訪問」。 – 2014-11-05 15:59:57

回答

1

感謝馬文斯密特我能確定這是沒有連接到CORS是報頭中的行爲的原因。我在Web服務器級別上設置了'Access-Control-Allow-Origin' => '*',所以我能夠獲得指向CakePHP安全組件的響應。

我基本上試圖發送一個POST-Reuqest到一個沒有期望數據應該發佈給它的API。因此訪問被拒絕。所以,我不得不添加$this->Security->csrfCheck = false到beforeFilter:

function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow(array('login')); 
    $this->Security->csrfCheck = false; 
} 
0

對於它的價值,爲CakePHP的3做正確的方法是如下

public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow(array('login')); 
    $this->eventManager()->off($this->Csrf); 
} 

雖然,這是不推薦的AJAX請求。以下文檔可以幫助您更多。 CSRF And AJAX