2017-02-15 73 views
0

運行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 * ... –

回答

0

要爲某些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