为什么我的 CSRF 令牌在使用 Form::open() 时为空?

Why is my CSRF token empty when using Form::open()?

刚开始所以请原谅我。我对 CodeIgniter 有很好的掌握,所以我明白发生了什么。但是,我注意到在创建表单时我的 CSRF 令牌是空的。我正在浏览 laracasts 视频以了解 Laravel 工作流程。

myfile.blade.php

 {!! Form::open((array('action' => 'MyController@method'))) !!}
    ...
 {{!! Form::close() !!}}

这是我查看源代码时得到的结果:

<form method="POST" action="http://mysite.dev/route" accept-charset="UTF-8">
<input name="_token" type="hidden">
</form>

我查看了配置目录,但没有看到任何关于必须启用 csrf 的信息。我需要更新其他设置吗?

感谢您的建议。

编辑

即使这样也给我一个空的隐藏输入字段:

{{ Form::token() }}  // <input name="_token" type="hidden">

编辑

这是我的控制器的样子:

//use Illuminate\Http\Request;
use Request;
use App\Article;
use App\Http\Requests;
use App\Http\Controllers\Controller;


public function store(Request $request)
{
    $input = Request::all();

    return $input;
}

所以我更新后的表单标签如下所示:

{!! Form::open((array('action' => 'ArticleController@store'))) !!}
...

当我提交时,我可以看到 json 响应 - 令牌显然是空的。

{"_token":"","title":"test","body":"test"}

应该是

{!! Form::open((array('action' => 'MyController@method')))  !!}
    ...
 {!! Form::close() !!}

Laravel 基础系列是针对 Laravel 5.0 的,因此您有一些选择。您可以安装 Laravel 5.0 以继续该系列。为了安装 L5.0,您需要 运行 这个命令:

composer create-project laravel/laravel {directory} "~5.0.0" --prefer-dist

如果您想使用 Laravel 5.2(我会推荐,Jeffrey Way 很可能很快会发布一个系列),还有一些额外的事情需要考虑。

首先,将所有路由放入 "web" 中间件组中,如下所示:

Route::group(['middleware' => ['web']], function () {

    // Put your routes inside here

});

过去,有几个中间件默认在每个请求上 运行。在 5.2 中,情况不再如此。比如token是保存在session中的,但是在5.2中,不会自动应用"StartSession"中间件之类的东西。因此,需要将 "web" 中间件应用于您的路由。 5.2 中此更改的原因:

Middleware groups allow you to group several route middleware under a single, convenient key, allowing you to assign several middleware to a route at once. For example, this can be useful when building a web UI and an API within the same application. You may group the session and CSRF routes into a web group, and perhaps the rate limiter in the api group.

另外,在Laravel Fundamental 系列中,Jeffrey 引入了"illuminate/html" 包,但现在,大多数人使用laravel 集体包。他们处理了很多从核心中取出的 Laravel 包。因此,我会删除 "illuminate/html" 包。在您的 composer.json 文件中,删除 "illuminate/html: 5.0" (或 require 部分中的任何内容)。此外,删除您添加到 config/app.php 文件的相应服务提供者和表单外观。

要安装 laravel 集体版本,请将其添加到您的 composer.json 文件中:"laravelcollective/html": "5.2.*-dev"。然后,运行composer update。完成后,在您的 config/app.php 文件中,将其添加到您的提供者数组中:

Collective\Html\HtmlServiceProvider::class,

并将其添加到您的别名数组中:

'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,

我希望我没有遗漏任何其他东西。

这是一个配置问题。您需要将配置文件中的应用程序密钥 ...config/app.php 设置为 32 个字符的字符串或使用 artisan cli php artisan key:generate 生成密钥以便您能够使用 CSRF 令牌。

还要确保在 web 组路由中包含使用 CSRF 令牌的路由。

You may exclude URIs by defining their routes outside of the web middleware group that is included in the default routes.php file, or by adding the URIs to the $except property of the VerifyCsrfToken middleware: http://laravel.com/docs/5.2/routing#csrf-protection

我已经解决了HtmlService provider的问题其实5.2版本去掉了Illuminate和add collective 按照步骤解决问题:

  1. composer require laravelcollective/html
  2. composer update
  3. 加入config/app.php

'providers' => ['Collective\Html\HtmlServiceProvider'], 'aliases' => [ 'Form' => 'Collective\Html\FormFacade', 'Html' => 'Collective\Html\HtmlFacade', ],

那么您就可以使用那个表格了。

如果您有登录页面并且想使用以下方法清除会话:

Session::flush();

不要忘记,这也会在将 csrf 令牌放入视图之前清除它