2013-04-11 1 views
0

CakePHP 2.x를 사용하여 REST API를 구축 중입니다. 필자는 쿼리 문자열에서 사용자 특정 액세스 토큰을 찾아 요청 사용자를 인증하는 TokenAuthenticate라는 특수 인증 처리기 클래스를 만들었습니다. 코드는 다음과 같습니다.CakePHP REST API : 액세스 토큰을 사용하여 각 요청에 대해 사용자 로그인을 요구하는 방법?

<?php 
App::uses('BaseAuthenticate', 'Controller/Component/Auth'); 

class TokenAuthenticate extends BaseAuthenticate { 
    public $settings = array(
     'fields' => array(
      'token' => 'access_token', 
     ), 
     'userModel' => 'User', 
     'scope' => array(), 
     'recursive' => 0, 
     'contain' => null, 
    ); 
    protected function _findUser($token) { 
     $userModel = $this->settings['userModel']; 
     list($plugin, $model) = pluginSplit($userModel); 
     $fields = $this->settings['fields']; 

     $conditions = array(
      $model . '.' . $fields['token'] => $token, 
     ); 
     if (!empty($this->settings['scope'])) { 
      $conditions = array_merge($conditions, $this->settings['scope']); 
     } 
     $result = ClassRegistry::init($userModel)->find('first', array(
      'conditions' => $conditions, 
      'recursive' => $this->settings['recursive'], 
      'contain' => $this->settings['contain'], 
     )); 
     if (empty($result) || empty($result[$model])) { 
      return false; 
     } 
     $user = $result[$model]; 
     unset($result[$model]); 
     return array_merge($user, $result); 
    } 
    public function authenticate (CakeRequest $request , CakeResponse $response) { 
     if(!empty($request->query['token'])) { 
      if($user = $this->_findUser($request->query['token'])) { 
       return $user; 
      } 
     } 
     return false; 
    } 

    public function logout (array $user) { 

    } 

    public function getUser (CakeRequest $request) { 
     if(!empty($request->query['token'])) { 
      if($user = $this->_findUser($request->query['token'])) { 
       return $user; 
      } 
     } 
     return false; 
    } 
} 
?> 

문제는 각 요청에서 토큰이 확인되지 않는다는 것입니다. 다른 사용자의 토큰을 사용하여 요청을하면 CakePHP는 여전히 이전 사용자의 토큰을 사용합니다. 나는 사용자가 어딘가에 세션 쿠키에 저장되어 있다고 생각한다. CakePHP가 각각의 요청에 대해 토큰을 검사하도록하거나 (또는 ​​세션을 파괴하는) 각 요청 후에 사용자를 로그 아웃하여 후속 요청에서 다른 토큰을 사용할 수있게하려면 어떻게해야합니까?

답변

관련 문제