我找不到在我的应用程序中对 API 用户进行身份验证的方法。我最初打算构建一个用户可以通过 Web 访问和验证的系统,但要求已经改变,我需要实现一些额外的操作,这些操作可以使用 POST API 调用以 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 用户的身份验证与 Web 用户的身份验证分开?
最佳答案
我会关注这个 guide在 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
中的新基本 Controller 替换该行为以强制登录,它将仅适用于需要登录的页面,而不适用于您的 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 服务,我相信您必须想出一个自定义身份验证/ token 方案。
关于php - Yii RESTful 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17958291/