Laravel为特定路由启用VerifyCsrfToken

问题描述:

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

我相信至少会证实请求来自我的应用程序。

对此有何指导?由于

UPDATE: 添加CSRF中间件的路线由@motie的建议,然后还加入了“StartSession”中间件的路线似乎工作后 - 但它并没有按照我所希望的实际工作 - 希望它能够比较令牌和失败 - 如果不匹配 - 但事实并非如此。

的VerifyCsrfToken在其检查以下内容:

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

它需要的那些条件中的任何一个,以通过 - 这是一个有点奇特的“isReading”简单地检查,如果请求使用“GET”方法所以目前它总是通过......

  • 还调用StartSession中间件似乎刷新,这意味着网络令牌和API调用令牌是不一样的API路线CSRF令牌。我认为将此路由添加到“Web”路由或向其添加“web”中间件可能会更容易...
+0

如果要启用CSRF检查API的路线,那么你可以简单地添加的路线* web.php *而不是* api.php * ... –

要为某些api路由启用csrf,请为其定义一个别名在```应用程序/ 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, 
    ] 
+1

靠近但是它给了我一个“会话存储未根据请求设置。“我认为我需要包含StartSession中间件。 – Andrew

+1

是的..很明显,它的确如此,我太简单地回答了:p – motia

+0

所以现在的问题是由API中间件生成的令牌与导致不匹配的web令牌不同。即使尝试使用“网络”中间件,但它似乎仍然不同。 – Andrew