【问题标题】:Laravel enable VerifyCsrfToken for specific routesLaravel 为特定路由启用 VerifyCsrfToken
【发布时间】:2017-07-03 17:00:24
【问题描述】:

运行 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”中间件可能会更容易......

【问题讨论】:

  • 如果你想启用 CSRF 检查 API 路由,那么你可以简单地将路由添加到 web.php 而不是 api.php.. .

标签: laravel


【解决方案1】:

要为某些 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,
    ]

【讨论】:

  • close... 但它给了我一个“未按请求设置的会话存储”。我想是因为我还需要包含 StartSession 中间件。
  • 是的..显然,确实如此,我太乐观了,无法给出简单的答案:p
  • 所以现在的问题是API中间件生成的token和webtoken不一样导致不匹配。甚至尝试使用“网络”中间件,但它似乎仍然不同。
  • 您应该将 csrf 令牌与您的请求一起发送到名为“X-CSRF-TOKEN”的 http 标头中或作为名为“_token”的表单输入。注意:csrf 不保护读取方法,即 GET、HEAD 和 OPTIONS
  • 它正在发送 - 只是不匹配
猜你喜欢
  • 2015-09-22
  • 2021-03-20
  • 2016-09-29
  • 2015-10-22
  • 2013-08-07
  • 2014-08-19
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
相关资源
最近更新 更多