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

2022-08-30 13:46:24

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

当事件发生并触发 Webhook 时,我们会向您选择的 URL 发送 POST 请求。POST 请求将使用 UTF-8 字符集和 application/x-www-form-urlencoded 编码。

问题是,当他们尝试向我的Laravel应用程序发送POST请求时,他们的post请求中没有添加CSRF令牌,中间件正在寻找令牌,最后它会抛出一个.VerifyCsrfTokenTokenMismatchException

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


答案 1

在《拉拉维尔5》中,这有点混乱。现在,您只需在类的数组中添加要从 csrftoken 验证中排除的路由$except

'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


答案 2

默认情况下,CSRF 在 Laravel 5 中的所有路由上都处于启用状态,您可以通过修改 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);
  }


推荐