【问题标题】:_Token was not found in request data in CakePHP 4在 CakePHP 4 的请求数据中找不到 _Token
【发布时间】:2020-05-03 15:49:52
【问题描述】:

我对 cakephp 4 中的简单注册功能有一些问题, 我启用了 FormProtection 组件,它返回“ _Token 未在请求数据中找到。”

令牌已经生成,但不知道为什么控制器检测不到

<?= $this->Form->create($user,['class' => '']) ?>
<?= $this->Flash->render('signup') ?>
<div class="inp-row">
<label for="">Full Name</label>
<?= $this->Form->input('name',["placeholder"=>"Your full name",'label'=>false,'required'=>true,'class' => '']) ?>
</div>
<div class="inp-row">
<label for="">Email Address</label>
<?= $this->Form->input('username',["placeholder"=>"Your email address",'label'=>false,'required'=>true,'type'=>'email','class' => '']) ?>
</div>
<div class="inp-row">
<label for="">Password</label>
<?= $this->Form->input('password',["placeholder"=>"Type your password",'label'=>false,'id'=>"pass_change" ,'required'=>true,'type'=>'password','class' => '']) ?>
</div>
<?= $this->Form->button(__('Sign up'));?>
<?= $this->Form->end() ?>

函数注册

$user = $this->Users->newEmptyEntity();
if ($this->request->is('post')) {

$user = $this->Users->patchEntity($user, $this->request->getData());
 if ($this->Users->save($user)) {
 $this->Flash->success(__("Your account has been created successfully."), [ 'key' => 'signup']);
        }

    }
$this->set('user', $user);


2020-05-05 23:48:32 Error: [Cake\Http\Exception\BadRequestException] `_Token` was not found in request data. in xxxxxx/vendor/cakephp/cakephp/src/Controller/Component/FormProtectionComponent.php on line 141
Stack Trace:
- xxxxxx/vendor/cakephp/cakephp/src/Controller/Component/FormProtectionComponent.php:95
- xxxxxx/vendor/cakephp/cakephp/src/Event/EventManager.php:309
- xxxxxx/vendor/cakephp/cakephp/src/Event/EventManager.php:286
- xxxxxx/vendor/cakephp/cakephp/src/Event/EventDispatcherTrait.php:92
- xxxxxx/vendor/cakephp/cakephp/src/Controller/Controller.php:569
- xxxxxx/vendor/cakephp/cakephp/src/Controller/ControllerFactory.php:72
- xxxxxx/vendor/cakephp/cakephp/src/Http/BaseApplication.php:229
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:77
- xxxxxx/vendor/cakephp/cakephp/src/Http/Middleware/BodyParserMiddleware.php:164
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:73
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:77
- xxxxxx/vendor/cakephp/cakephp/src/Http/Middleware/CsrfProtectionMiddleware.php:137
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:73
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:58
- xxxxxx/vendor/cakephp/cakephp/src/Routing/Middleware/RoutingMiddleware.php:162
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:73
- xxxxxx/vendor/cakephp/cakephp/src/Routing/Middleware/AssetMiddleware.php:68
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:73
- xxxxxx/vendor/cakephp/cakephp/src/Error/Middleware/ErrorHandlerMiddleware.php:119
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:73
- xxxxxx/vendor/cakephp/cakephp/src/Http/Runner.php:58
- xxxxxx/vendor/cakephp/cakephp/src/Http/Server.php:90
- xxxxxx/webroot/index.php:40

【问题讨论】:

  • 每当您收到错误时,请发布 complete 错误消息(包括文件名和行号),并包含相关的堆栈跟踪(您可以在 CakePHP @ 987654323@) - 谢谢!你也在使用安全组件吗?
  • 感谢您的回复,我添加了错误日志。是的,我也使用 Auth 和 Security 组件

标签: php cakephp cakephp-4.x


【解决方案1】:

安全组件已被弃用,其功能已被提取到表单保护组件和 HTTPS 强制执行器中间件中。它已被弃用的事实可能应该在 Cookbook 中更突出地展示。

同时使用表单保护组件和安全组件将导致您遇到的错误,因为安全组件和表单保护组件都会从请求数据中删除一次_Token它已经过验证,因此其中一个会抱怨令牌不存在。

长话短说,不要使用安全组件,只使用表单保护组件。如果您使用的是安全组件的 require SSL 功能,请改用最初提到的 HTTPS 强制中间件。

另见

【讨论】:

  • 谢谢,我禁用了安全组件并添加了 HTTPS 强制中间件,但 https 重定向不起作用,它返回错误:http 请求的“错误请求”
  • @devlogi 听起来您可能配置错误,并禁用了重定向。
  • 我在 src/Application.php 中添加了这一行 ->add(new HttpsEnforcerMiddleware([ 'HttpsEnforcerMiddleware' => true ]))
  • 2020-05-06 14:43:13 错误:[Cake\Http\Exception\BadRequestException] 错误请求在 xxxxxxx/vendor/cakephp/cakephp/src/Controller/Component/FormProtectionComponent.php 上第 141 行堆栈跟踪: - xxxxxxx/vendor/cakephp/cakephp/src/Controller/Component/FormProtectionComponent.php:95 - xxxxxxx/vendor/cakephp/cakephp/src/Event/EventManager.php:309 - xxxxxxx/vendor/cakephp/ cakephp/src/Event/EventManager.php:286
  • @devlogi 该错误源于表单保护组件,这意味着令牌不匹配。它与最初的问题无关,因此您可能应该打开一个新问题,在那里您可以添加更多详细信息,例如您正在执行的请求类型,可能是您的表单,正在发送的数据,完整的堆栈跟踪,等等。如果您启用了调试模式,则错误页面可能还会包含其他信息。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
相关资源
最近更新 更多