2012-08-05 4 views
1

보안 구성 요소가 켜기를 원합니다.보안 구성 요소가있는 CakePHP 및 Facebook

하지만 CakePHP 앱을 Facebook 탭에로드 할 때 FB는 내 양식에 $ _REQUEST [ 'signed_request']를 게시합니다.이 문제는 보안 구성 요소가이 "게시물"에 "반응"하고 유효성 검사를 제공한다는 것입니다 오류, 블랙홀 등

어떻게이 문제를 해결할 수 있습니까?

이 문제를 해결하려면 설명서에서 아무 것도 찾을 수 없습니다.

보안 구성 요소를 "수동으로"실행하여 실제로 양식을 제출할 때 "반응"하고 Facebook은 $ _REQUEST [ 'signed_request']를 양식에 게시 할 때가 아닙니다.

UPDATE :

<?php 
App::uses('CakeEmail', 'Network/Email'); 

class PagesController extends AppController { 
    public $helpers = array('Html','Form'); 
    public $components = array('RequestHandler'); 

    public function beforeFilter() { 
     parent::beforeFilter(); 
     $this->Auth->allow('*'); 

     $this->Security->validatePost = true; 
     $this->Security->csrfCheck = true; 
     $this->Security->unlockedFields[] = 'signed_request'; 
    } 

    public function home() { 
     $this->loadModel('Memberx'); 
       if($this->request->is('post') && isset($this->request->data['Memberx']['name'])) { 
       //...save here, etc. ... 
       } 
    } 

는 참고 : 나는 "블랙홀"오류가 발생합니다.

최종 업데이트 (@ tigrang의 대답 후) : 다음

public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow('*'); 

    $this->set('hasLiked', false); 

    if(isset($this->request->data['signed_request'])){ 
     $this->set('hasLiked', $this->hasLiked($this->request->data['signed_request'])); 
    } 

    if(isset($this->request->data['Memberx']['signed_request'])) { 
     $this->set('hasLiked', $this->hasLiked($this->request->data['Memberx']['signed_request'])); 
    } 

    /* 
    To go around Facebook's post $_REQUEST['signed_request'], 
    we unset the $_REQUEST['signed_request'] and disable the csrfCheck 
    ONLY after we have set the hasLiked view variable 
    */ 
    unset($this->request->data['signed_request']); 
    if (empty($this->request->data)) { 
     $this->Security->csrfCheck = false; 
    }   
} 

, 내보기에 다음과 같은 작업을 수행합니다

<?php 
if($hasLiked) { 
?> 
    You have liked this page! 
<?php 
} 
?> 

답변

2
public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow('*'); 
    $this->_validateFbRequest(); 
} 

protected function _valdiateFbRequest() { 
    if (!isset($this->request->data['signed_request'])) { 
     // not a valid request from fb 
     // throw exception or handle however you want 
     return; 
    } 
    $signedRequest = $this->request->data['signed_request']; 
    unset($this->request->data['signed_request']); 
    if (empty($this->request->data)) { 
     $this->Security->csrfCheck = false; 
    } 
    // validate the request 
} 
+0

감사합니다 순전히! $ this-> request-> 데이터가 비어 있는지 확인한 다음 $ this-> Security-> csrfCheck를 false로 설정하면 문제가 해결됩니다! – wenbert

+0

@tigrang 나는 같은 종류의 문제가 있습니다. 어떻게 그 함수의 "// 요청의 유효성 검사"부분을합니까? – hemppa