Laravel为特定路由启用VerifyCsrfToken

时间:2017-02-15 06:55:09

标签: laravel

运行Laravel 5.3我的应用程序为网站上的访客调用了某些API路由。 我不希望这些内容完全公开并且可以直接访问,因此我认为我只需要在这些路由中添加“VerifyCsrfToken”中间件。

我相信至少会确认请求来自我的申请。

对此有何指导?感谢

更新 在按照@motie的建议将csrf中间件添加到路由之后,然后添加“StartSession”中间件,这条路线似乎也能正常工作 - 但它实际上并没有按照我的希望工作 - 希望能比较令牌和如果不匹配就会失败 - 但事实并非如此。

VerifyCsrfToken在其检查中包含以下内容:

if (
        $this->isReading($request) ||
        $this->runningUnitTests() ||
        $this->shouldPassThrough($request) ||
        $this->tokensMatch($request)
    )

它需要传递任何一个条件 - 这有点奇怪,因为“isReading”只是检查请求是否使用“GET”方法,因此它总是通过......

  • 同样调用StartSession中间件似乎刷新了API路由的csrf令牌,这意味着Web令牌和api调用令牌不一样。我认为将此路由添加到“Web”路由或将“web”中间件添加到其中可能更容易...

1 个答案:

答案 0 :(得分:0)

要为某些api路由启用csrf,请在```app / Http / Kernel.php ::

中为它定义别名
tected $routeMiddleware = [
   ...
    'csrf' => \App\Http\Middleware\VerifyCsrfToken::class,
    'session' => \Illuminate\Session\Middleware\StartSession::class,
   ...
]

然后您就可以将它添加到api.php中所需的路线。

Route::get('secured-api-route', ['middleware' => 'csrf']);

编辑:

使用csrf中间件需要激活会话中间件。因此,创建一个新的中间件组比注册单独的中间件更好。

    'api.csrf' => [
        \Illuminate\Session\Middleware\StartSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ]