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/*',
];
}
我的路线文件顶部有这段代码
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/*',
];
}