使用REST API进行Laravel CSRF保护

Vij*_*ath 8 api rest csrf laravel

我在路由文件的顶部有这个代码

Route::when('*', 'csrf', array('post', 'put', 'delete'));
Run Code Online (Sandbox Code Playgroud)

当我测试我的RESTful API层时,我得到令牌不匹配错误.怎么解决这个?

我将CSRF保护用于用户可能执行的常规表单提交.但是如何为API工作呢?我的API调用按照常规路由分组,如下所示

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

Ach*_*dja 9

在你的 App\Http\Middleware\VerifyCsrfToken

你将有这样一个班级,将你的路线添加到$除外

namespace App\Http\Middleware;

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

class VerifyCsrfToken extends BaseVerifier
{
  protected $except = [
    'shows/*',
    'episode/*',
    'genre/*',
  ];
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,似乎你有一个更好的解决方案,但有时人们不关心“无状态概念”或(在此处插入一个复杂的最佳实践术语),我不是说它们不好或其他什么,而是使用不需要的小应用程序使事情变得更复杂 (2认同)

Gie*_*šys 7

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

如果你是不是有这样的线Route::group(['middleware' => 'web'], function () {在你的routes.php文件,然后你laravel版本是一个在默认情况下使用它.检查RouteServiceProvider.php此行的文件:https://github.com/laravel/laravel/blob/master/app/Providers/RouteServiceProvider.php#L56.

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