2014-02-13 4 views
6

그래서 개발중인 웹 앱용 REST API를 만들고 있는데, 인증을위한 기본 방법은 각 요청에 자격 증명을 보내거나 토큰을 보내는 중임을 알고 있습니다.REST API에서 CakePHP 인증

이전에 토큰을 사용한 적이 없기 때문에 각 요청에 대한 자격 증명을 보낼 수 있다고 생각합니다. 요점은 컨트롤러에서 이것을 처리하는 방법에 대한 예제를 찾을 수 없다는 것입니다. 이게 뭔가?

public function api_index() { 
    if(!$this->Auth->login()) return; 

    $this->set(array(
     'models' => $this->Model->find('all'), 
     '_serialize' => array('models') 
    )); 
} 

나는 이것이 실제로 AuthComponent::login()의 작동 방식이라고 생각하지 않습니다. 제발 여기 방향을 알려주세요.

답변

1

AuthComponent :: login()은 사용자 데이터를 저장하는 세션 변수를 생성하므로 데이터가 유사하다고 가정합니다.

$data = array('User' => array('id' => 1, 'username' => 'johndoe')); 

그런 다음 사용자 ID를 $this->Auth->deny();를 넣어으로, beforeFilter 당신의 AppControllers에서

$this->Auth->user('User.id'); 

를 얻으려면

$this->Auth->login($data); 

을 사용하고

$this->Auth->user('User'); 

으로 데이터에 액세스 할 것이라고 로그인하지 않은 사람에 대한 모든 작업을 거부합니다. 그러면 필터 앞에 각 컨트롤러에서 $this->Auth->allow(array('view'));의 '보기'가 공개되기를 원하는 작업의 이름이됩니다.

http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

+0

답장을 보내 주셔서 감사합니다. 나는 API를 사용하는 모바일 앱이 세션을 유지할 수 없기 때문에 각 동작에 대해 어떻게 인증해야하는지 궁금했다. –

5

좋아, 어떻게 AuthComponent :: 로그인 작품에 대해 먼저 설명. Cake 2.x에서이 방법은 인증을하지 않고 세션에 Auth.User 배열을 만듭니다. 실제 인증을 직접 구현해야합니다 (사용자 모델은이를 수행하기위한 자연스러운 장소입니다). 기본 인증 방법은 다음과 같을 수 있습니다.

App::uses('AuthComponent', 'Controller/Component'); 
public function authenticate($data) { 
    $user = $this->find('first', array(
     'conditions' => array('User.login' => $data['login']), 
    )); 
    if($user['User']['password'] !== AuthComponent::password($data['password']) { 
     return false; 
    } 

    unset($user['User']['password']); // don't forget this part 
    return $user; 
    // the reason I return the user is so I can pass it to Authcomponent::login if desired 
} 

이제 사용자 모델이로드되어있는 한 모든 컨트롤러에서 사용할 수 있습니다. Controller::loadModel('User')을 호출하여로드 할 수 있다는 사실을 알고있을 수 있습니다. 당신은 모든 요청을 인증하려는 경우

, 당신은 다음의 AppController의으로, beforeFilter 방법에 넣어해야합니다

public function beforeFilter() { 
    $this->loadModel('User'); 
    if(!$this->User->authenticate($this->request->data)) { 
     throw new UnauthorizedException(__('You don\'t belong here.')); 
    } 
} 

위의 모든

는 로그인과 암호 모든 시간 POST 값을 전달한다고 가정합니다. 나는 토큰 인증이 확실히 더 좋은 방법이라고 생각하지만, 일어나서 이것을 실행하는 것이 효과가있다. 몇 가지 단점은 모든 요청과 매번 해싱 알고리즘의 높은 CPU 사용량을 때마다 일반 텍스트로 암호를 보내는 것입니다 (ssl을 요구하지 않는 한). 그럼에도 불구하고, 이것이 당신에게 cakephp로 인증하는 법을 더 잘 이해하기를 바랍니다.

무엇인가 명확하게해야하는지 알려주세요.

업데이트 : 게시 한 이래로 실제로 매개 변수없이 AuthComponent :: login을 사용할 수 있다는 것을 알았지 만, 그렇게하는 팬이 아닙니다. CakePHP 문서에서 :

In 2.x $this->Auth->login($this->request->data) will log the user in with 
whatever data is posted, whereas in 1.3 $this->Auth->login($this->data) 
would try to identify the user first and only log in when successful. 
1

Cakephp 2.X, 인터넷에서 이것에 대한 많은 연구 끝에 만족스런 대답을 찾지 못했습니다. 그래서이 방법을 찾았습니다. 이 대답은 미래에 어떤 사람들을 도울 것입니다. 이 답변은 케이크 PHP의 REST API에만 적용됩니다.

추가 $this->Auth->login().

$this->request->data['User'] = $this->request->data ; 
if($this->Auth->login()){ 
    echo "Hurray You are logged In from REST API."; 
} 
else 
{ 
    throw new UnauthorizedException(__('You don\'t belong here.')); 
} 

Desciption을 점검하기 전에 REST API의 논리 액션 라인 다음 @threeve$this->Auth->login() 어떤 인증 자체를하지 않는다는 답변 중 하나에 말했듯이. 오히려 세션에 Auth.User 배열을 만듭니다. 인증을 위해서 우리는 $ this-> request-> 데이터가 User 배열 안에 있어야합니다. 왜냐하면 User는 데이터베이스의 자격 증명을 검사 할 모델이기 때문입니다. 따라서 REST API를 사용하지 않을 때 필요하므로 Auth에 데이터를 전달해야합니다. 나머지는 Cake와 Auth 자체에서 처리합니다.

이 대답에 대한 개선 사항이나 제안 사항을 환영합니다.