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”中间件可能会更容易...
答
要为某些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,
]
如果要启用CSRF检查API的路线,那么你可以简单地添加的路线* web.php *而不是* api.php * ... –