2013-07-30 3 views
3

내 애플리케이션에서 API 사용자를 인증하는 방법을 찾는 데 문제가 있습니다. 사용자가 웹을 통해 액세스하고 인증 할 수있는 시스템을 처음 만들었지 만 요구 사항이 변경되어 POST API 호출을 사용하여 RESTful 방식으로 사용할 수있는 몇 가지 추가 작업을 구현해야합니다.Yii RESTful 인증

CBehaviour 확장 클래스를 만들고 모든 인증되지 않은 사용자 (found on the yii framework forum here)의 로그인 페이지로 리디렉션하도록했습니다. 문제는 모든 API 호출이 동일한 로직을 통해 강제되고 모든 POST 요청이 HTML을 로그인 페이지로 뱉어 버리는 것입니다.

class ApplicationBehavior extends CBehavior { 
    private $_owner; 

    public function events() { 
     return array(
      'onBeginRequest' => 'forceGuestLogin', 
     ); 
    } 

    public function forceGuestLogin() { 
     $owner = $this->getOwner(); 
     if ($owner->user->getIsGuest()) 
      $owner->catchAllRequest = array("site/login"); 
    } 
} 

웹 사용자로부터 API 사용자 인증을 분리하는 방법은 무엇입니까?

답변

3

나는 Yii에 REST API를 만들 때 이걸 guide을 따라갈 것이다. config urlManager 항목을 수정하면 모든 API 요청에서 APIController가 사용됩니다. 모든 REST 요청이 전송되기 때문에 내 목적을 위해 작품을 위의 코드 : 사용자가 게스트 (또는 오류 메시지)

protected function beforeAction($event) { 
    if (Yii::app()->user->isGuest) { 
     echo "Invalid credentials"; 
     Yii::app()->end(); 
    } 
} 

참고 인 경우는 아무것도 돌려주지 않는 당신의 APIController의 beforeAction에 다음 코드를 배치 할 수 있습니다 같은 브라우저를 통해. (이미 로그인되어 있고 로그인 쿠키가 있습니다)

protected/controllers에있는 새로운 기본 컨트롤러로 해당 동작을 바꾸면 강제로 로그인 할 수 있습니다.이 동작은 로그인이 필요한 APIController 페이지에만 적용됩니다. 다음은 내 예입니다.

//Make sure all Controllers which require a login inherit from this 
class ControllerLoginRequired extends CController { 
    public function runAction($action) { 
     if (Yii::app()->user->isGuest && 'site' != $this->route) { 
      Yii::app()->user->returnUrl = $this->route; 
      parent::redirect(array('site/login')); 
     } else { 
      parent::runAction($action); 
     } 
    } 
} 

설명 된 모든 내용은 사용자가 Yii에 로그인 한 동일한 브라우저를 통해 REST 요청에 대해 작동합니다. Yii에 로그인 한 브라우저가 아닌 소비자에게 REST 서비스를 노출 할 필요가 있다면 맞춤 인증/토큰 체계가 필요하다고 생각한다.

+0

예 이미 튜토리얼의 일부 코드를 모았습니다. Yii의 REST API를 설명하는 유일한 코드이며, 누구나 참조 할 수 있습니다. 문제는 여전히 Guest 로그인을 강제하는 내 CBehavior의 확장이이 API 컨트롤러에서 실행되기 때문에이 API 컨트롤러의 모든 내용을 재정의한다는 의미입니다. –

+1

로그인으로 리디렉션하는 동작을 사용하는 대신 로그인이 필요한 모든 컨트롤러에서 상속되는 LoginRequiredController를 사용합니다. 이런 식으로하면 적어도 그 문제를 해결할 수 있습니다. APIController for REST는 그 것을 상속받지 않습니다. – Mikt25

+0

우수! 그건 완벽하게 작동합니다. 답변을 업데이트 할 수있는 경우 승인 된 것으로 표시됩니다. –