3

我无法找到在我的应用程序中验证 API 用户的方法。我开始着手构建一个用户可以通过 Web 访问和验证的系统,但是需求发生了变化,我需要实现一些额外的操作,这些操作可以使用 POST API 调用以 RESTful 方式提供。

我创建了一个类,该类扩展CBehaviour并强制所有未经身份验证的用户重定向到登录页面(在此处的 yii 框架论坛上找到)。问题是所有 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 用户的身份验证与 Web 用户分开?

4

1 回答 1

3

我会按照本指南在 Yii 中创建 REST API。修改配置 urlManager 条目后,您的所有 API 请求都将使用 APIController。然后,您可以将以下代码放在 APIController 的 beforeAction 中,如果用户是访客(或错误消息),则不返回任何内容

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

注意:上面的代码适用于我的目的,因为所有 REST 请求都是通过同一个浏览器发送的。(已经登录并有登录cookie)

如果你用一个新的基本控制器替换该行为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 请求。如果你需要将你的 REST 服务暴露给不是浏览器登录到 Yii 的消费者,我相信你必须想出一个自定义的身份验证/令牌方案。

于 2013-07-30T22:18:52.190 回答