使用REST API实现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');
});

AppHttpMiddlewareVerifyCsrfToken

你将有这样一个类,将你的路线添加到$except

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

您应该考虑为您的web和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'部分,并在routes.php中对路由进行分组。然后,在需要会话、csrf和其他东西的部分使用web中间件,在不需要这些东西的地方使用api中间件(api中间件组不包括会话、加密cookie和csrf验证)。

最新更新