我在路由文件的顶部有这段代码
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验证)。