2014-11-05 2 views
1

Я использую CakePHP как backend и Angular как frontend, тогда как front-& бэкэнд находятся в разных доменах, так что это в основном ситуация CORS.CORS - CakePHP не принимает AngularJS JSON-Request

В основном я пытаюсь отправить содержимое формы в Cake-API (позже это предназначено для части аутентификации, но я не выполняю ранее) через $ http.post. Так вот код:

aeapBackend.login = function(username, password) { 
    return $http.post(
     API_URL + 'api_mobile_user/login', { 
      test: username, 
      test2: password 
     } 
    ); 
}; 

В то время как соответствующий API в CakePHP выглядит следующим образом:

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 публикует дополнительную информацию, которая не проверяется во время предполета, а затем отбрасывается бэкэнд.

Используемые версии: CakePHP 2.5.3, AngularJS: 1.3.0

+2

У меня есть 0 опыта в CakePHP, но может ли быть ваш код сервера для добавления заголовков, работает только при появлении «OPTIONS» (предполетный)? Кроме того, какие заголовки вы отправляете? все ли они в списке «HTTP-заголовков по умолчанию» или ваш явно настроенный «контент-тип»? –

+0

@MarvinSmit: «content-type» явно установлен («Access-Control-Allow-Headers» => «Content-Type»), в противном случае предполетная ошибка завершится неудачно. Когда я использую $ http.get, у меня нет трудностей с получением данных из бэкэнд, поэтому я предполагаю, что заголовки не просто установлены во время предполета. Спасибо за замечание в любом случае - я дважды проверю это. –

+1

Что я имел в виду с заголовками: Хорошая реализация CORS вернет 401/403, если заголовок отправляется с POST, который не находится в «правильных заголовках для списка CORS».Предполетная панель позволяет узнать, разрешены ли заголовки, отправленные с помощью фактического POST (с помощью «заголовков запросов» ->, отвечающих реализацией CORS с «разрешенными заголовками»). Любой заголовок, отправленный в сообщение за пределами «разрешенных заголовков» или «HTTP-заголовков по умолчанию» (в соответствии с спецификацией CORS), должен вызывать «запрет доступа». –

ответ

1

Благодарности к Marvin Smit я был в состоянии определить причину поведения, которое не было связано с CORS являются заголовки. Я установил '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

Смежные вопросы