在Laravel 5中,如何为特定路由禁用VerifycsrfToken中间件?

问题描述 投票:27回答:5

我正在使用Laravel 5开发应用程序。我的应用程序已连接VendHQ API,我打算通过其Webhook从VendHQ获取一些数据。根据他们的Documentation

[发生事件并触发网络挂钩时,​​我们将发送POST请求到您选择的URL。 POST请求将位于UTF-8字符集,以及application / x-www-form-urlencoded编码。

问题是,当他们尝试向我的Laravel应用发送POST请求时,没有在他们的发布请求中添加CSRF令牌,VerifyCsrfToken中间件正在寻找令牌,最后它抛出TokenMismatchException

我的问题是,如何使某些特定路由避免使用默认的VerifyCsrfToken中间件,同时保持其他发布请求的活动状态?

php laravel laravel-5 csrf-protection
5个回答
18
投票

默认情况下,Laravel 5中的所有路由上均已启用CSRF,您可以通过修改app / Http / Middleware / VerifyCsrfToken.php将其禁用于特定路由

//app/Http/Middleware/VerifyCsrfToken.php

//add an array of Routes to skip CSRF check
private $openRoutes = ['free/route', 'free/too'];

//modify this function
public function handle($request, Closure $next)
    {
        //add this condition 
    foreach($this->openRoutes as $route) {

      if ($request->is($route)) {
        return $next($request);
      }
    }

    return parent::handle($request, $next);
  }

source


57
投票

在Laravel 5中,这有点变了。现在,您可以在类的$except数组中简单地添加要从csrftoken验证中排除的路由。

'VerifyCsrfToken'(\ app \ Http \ Middleware \ VerifyCsrfToken.php):

class VerifyCsrfToken extends BaseVerifier
{
    protected $except = [
        // Place your URIs here
    ];
}

示例:

1。如果您使用的是路由组:
Route::group(array('prefix' => 'api/v2'), function()
{
    Route::post('users/valid','UsersController@valid');
});

您的$except数组看起来像:

protected $except = ['api/v2/users/valid'];

2。如果您使用的是简单路线

Route::post('users/valid','UsersController@valid');

您的$except数组看起来像:

protected $except = ['users/valid'];

3。如果要排除主路由下的所有路由(在这种情况下为用户)

您的$except数组看起来像:

protected $except = ['users/*'];

请参阅:http://laravel.com/docs/master/routing#csrf-excluding-uris


8
投票

如果使用的是5.2版,则位于以下位置:app / Http / Middleware / VerifyCsrfToken.php您可以将路由添加到属性:protected $ except:例如:


4
投票

将路线添加到App\Http\Middleware\VerifyCsrfToken.php文件:

© www.soinside.com 2019 - 2024. All rights reserved.