使用REST API进行Laravel CSRF保护

时间:2016-05-10 08:49:11

标签: api rest laravel csrf

我的路线文件

顶部有此代码
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');
});

2 个答案:

答案 0 :(得分:7)

App\Http\Middleware\VerifyCsrfToken

您将拥有这样一个班级,将您的路线添加到$ except

namespace App\Http\Middleware;

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

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

答案 1 :(得分:5)

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

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

如果出现,请移除routes.php部分并在web中对自己的路线进行分组。然后使用api中间件作为您需要会话,csrf和其他内容的部分,并使用api中间件,您不需要这些内容(a:visited中间件组不包含会话,加密的cookie和csrf验证)。