gpt4 book ai didi

api - CakePHP 3 REST API 身份验证,同时仍使用现有 Controller

转载 作者:行者123 更新时间:2023-12-04 22:06:07 24 4
gpt4 key购买 nike

我在 CakePHP 3 中为移动设备实现 REST API 身份验证时遇到问题。

阅读 Authentication 官方 CakePHP 3 文档:

http://book.cakephp.org/3.0/en/controllers/components/authentication.html#id1

它说我可以使用无状态基本身份验证而不是表单例份验证。但是,我还在其中一个论坛中了解到您不能同时使用基本身份验证和表单例份验证。

我还研究了为 REST API 使用前缀路由。

http://www.bravo-kernel.com/2015/04/how-to-prefix-route-a-cakephp-3-rest-api/

通过这样做,我现在可以对前缀路由执行基本身份验证,对非前缀路由执行表单例份验证。然而,这需要在其前缀命名空间中定义 Controller ,这违反了 CakePHP 保持代码干燥的概念;因为我的 Controller 已经包含满足网络和移动设备的逻辑。

如果我只使用表单例份验证,我可以只创建一个从我的手机到 Web 系统的 POST 请求,但响应将采用 HTML 格式。解析整个 HTML 格式不是一个好方法。

我被卡住了,不知道该怎么办。我整个下午都在继续研究,但仍然没有找到解决方案。

我想要的只是能够通过我的移动应用程序进行身份验证,同时仍然使用相同的 Controller 。

编辑:解决方法

class AppController extends Controller
{
public function initialize()
{
parent::initialize();
$this->loadComponent('Auth', [
'authorize' => 'Controller',
'authenticate' => [
'Form' => [
'fields' => [
'username' => 'username',
'password' => 'password'
]
]
],
'loginAction' => ['controller' => 'Users', 'action' => 'login'],
'unauthorizedRedirect' => $this->referer()
]);
}

public function beforeFilter(Event $event)
{
if($this->request->params['_ext'] === 'json')
{
$this->Auth->config('authenticate', ['Basic' => ['userModel' => 'Users']]);
$this->Auth->config('storage', 'Memory');
$this->Auth->config('unauthorizedRedirect', false);
}
return parent::beforeFilter($event);
}
}

通过有条件地将基本身份验证添加到身份验证配置来管理以使其工作。

然而,这并不是完美的解决方案,因为它肯定存在缺陷。

这仅在以下假设下有效:
  • 引用这篇文章:CakePHP 将根据身份验证方案的顺序做一个优先级。由于Form Auth 在Basic Auth 之前出现,如果Form Auth 成功,则Basic Auth 将不会执行。

    CakePHP 2.1 - As a web application and REST service with Authentication
  • 通常,Web 用户不会访问文件扩展名为 json 的 URL,因此用户将使用 Form Authentication 重定向到用户登录页面。
  • 一旦用户通过表单例份验证,即使用户使用 AJAX 间接访问以 .json 结尾的 URL,基本身份验证也不会弹出。

  • 有没有更好的办法?

    最佳答案

    你可以通过使用 basic authentication 来做到这一点.for web 你必须使用 form authenticationREST API您必须使用 basic authentication .并且您可以同时使用两者。我已经在下面实现了它是工作示例。

       public function initialize() {
    parent::initialize();
    $this->loadComponent('RequestHandler');
    $this->loadComponent('Flash');
    $url = $this->request->url;
    $ext = $this->request->params['_ext'];
    if ((isset($ext) && $ext == 'json') && (!($this->request->is('ajax')) && ($url != 'users/loginapi.json')) ) {
    $this->loadComponent('Auth', [
    'authenticate' => [
    'Basic' => [
    'fields' => ['username' => 'email', 'password' => 'api_key'],
    'userModel' => 'Users',
    'scope' => ['status' => 'A']
    ],
    ],
    'storage' => 'Memory',
    'unauthorizedRedirect' => false
    ]);
    } else {
    $this->loadComponent('Auth', [
    'authenticate' => [
    'Form' => [
    'fields' => ['username' => 'email_or_mobile', 'password' => 'password'],
    'userModel' => 'Users',
    'scope' => ['status' => 'A'],
    'finder' => 'auth'
    ]
    ],
    'storage' => 'Session',
    //'unauthorizedRedirect' => false,
    'loginRedirect' => [
    'controller' => 'Users',
    'action' => 'index'
    ],
    'logoutRedirect' => [
    'controller' => 'Users',
    'action' => 'login'
    ],
    'authError' => false
    ]);
    }
    }

    关于api - CakePHP 3 REST API 身份验证,同时仍使用现有 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36007176/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com