Laravel REST 的 CSRF 保护 API

Laravel CSRF protection with REST API

我的路线文件顶部有这段代码

Route::when('*', 'csrf', array('post', 'put', 'delete'));

当我测试 RESTful API 层时,出现令牌不匹配错误。如何解决这个问题?

我对用户可能进行的常规表单提交使用 CSRF 保护。但这对 API 有何影响?我的 API 呼叫在我的常规路线之后分组,如下所示

Route::group(array('prefix' => 'api'), function () {
Route::resource('shows', 'ShowsApiController');
Route::resource('episode', 'EpisodesApiController');
Route::resource('genre', 'GenresApiController');
});

您应该考虑为您的网络和 api 层使用不同的中间件组。 Laravel 默认情况下,取决于您使用的版本,使用 web 中间件组。

如果您的 routes.php 文件中没有这样的行 Route::group(['middleware' => 'web'], function () {,那么您的 laravel 版本就是默认使用它的版本。检查您的 RouteServiceProvider.php 文件中的这一行:https://github.com/laravel/laravel/blob/master/app/Providers/RouteServiceProvider.php#L56.

如果出现,请删除 'middleware' => 'web' 部分和分组路线 Yourself in routes.php。然后在需要会话、csrf 和其他东西的部分使用 web 中间件,在不需要这些东西的部分使用 api 中间件(api 中间件组不包括会话,加密cookie 和 csrf 验证)。

在你的App\Http\Middleware\VerifyCsrfToken

你会有这样一个class,把你的路由添加到$except

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
  protected $except = [
    'shows/*',
    'episode/*',
    'genre/*',
  ];
}