将 Cakephp Auth 组件用于 Web 服务

Use Cakephp Auth component for webservices

我正在为 android 应用程序创建网络服务。我正在使用 cakephp 3 Auth。我从 $this->request->query['username']$this->request->query['password].

中的 android 应用获取用户名和密码

如何使用 Auth 组件来识别用户?

到目前为止我试过的是:

public function login(){
    if(!empty($this->request->query['username']) && !empty($this->request->query['password'])){
        $this->loadComponent('Auth');
        $user=$this->Auth->identify($this->request->query['username'],$this->request->query['password']);
        if($user){
            $this->output(['status'=>'1','message'=>'Success','user_id'=>(string)$user->id,'plan_id'=>
                    (string)$user->plan_id]);
        }else{
            $this->output(['status'=>'0','message'=>'Invalid Username/Password.']);
        }
    }    
}

我在使用 debug($user); 时收到 false,即使我使用的是正确的凭据。

你不能只是把东西放在一起并期望它能工作...我的意思是,文档在哪里说 AuthComponent::identify() 会将用户名和密码作为参数?

在一个动作中加载 auth 组件也是毫无意义的,因为该单个动作只需要 work/be 身份验证。同样,不要只是把东西放在一起,阅读文档,尝试理解它们是如何工作的,如果有必要,请查看源代码,然后然后开始编码,如图所示在文档中!

也就是说,默认身份验证器需要 POST 数据中的凭据

表单认证

[...]

  • FormAuthenticate allows you to authenticate users based on form POST data. Usually this is a login form that users enter information into.

[...]

By default AuthComponent uses FormAuthenticate.

* 强调我的

Cookbook > Controllers > Components > Authentication

因此,理想情况下,您会 POST 凭据而不是将它们作为查询字符串参数传递。如果那不可能并且您必须使用 GET(您应该有充分的理由这样做),那么您可以选择 create a custom authenticator 从查询中获取数据,甚至将查询字符串数据传递给 POST 尝试对用户进行身份验证之前的数据,

$this->request->data['username'] = $this->request->query('username');
$this->request->data['password'] = $this->request->query('password');

这有点难看。

正在加载授权组件

如前所述,您不会在操作中加载 auth 组件,如文档中所示,这应该在控制器 initialize() 方法中完成,理想情况下,以防完整的应用程序应该是受保护,这将是 AppController

public function initialize()
{
    parent::initialize();
    $this->loadComponent('Auth', /* ... */);
    // ...
}

Cookbook > Controllers > Components

另见