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

Posted

技术标签:

【中文标题】在 Laravel 5 中,如何禁用特定路由的 VerifycsrfToken 中间件?【英文标题】:In Laravel 5, How to disable VerifycsrfToken middleware for specific route? 【发布时间】:2015-09-22 06:17:52 【问题描述】:

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

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

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

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

【问题讨论】:

你使用 Laravel 5 还是 5.1? @Alexandros 它的 Laravel 5 【参考方案1】:

在 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

【讨论】:

其他答案中使用protected $except = ['/specificroutes*'];的方法更简单 @PaulH 不适用于 laravel 5.0【参考方案2】:

在 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

【讨论】:

非常有用的知识【参考方案3】:

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

例如:

protected $except = [
    'users/get_some_info',
];

执行此更改后,请确保在您的 routes.php 中添加路由。

【讨论】:

您也可以使用通配符作为'*users/get_some_info*'【参考方案4】:

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

/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'route-name-1', 'route-name-2'
];

【讨论】:

以上是关于在 Laravel 5 中,如何禁用特定路由的 VerifycsrfToken 中间件?的主要内容,如果未能解决你的问题,请参考以下文章

禁用特定文件夹/路由的 Laravel 路由

在 laravel 5.4 中为某些路由禁用 csrf 令牌?不工作[重复]

laravel 5.2 中特定路由的 web 中间件

Laravel 5.5登录后重定向到特定路由

如何在 Laravel 中禁用注册新用户

如何在 laravel 上限制特定用户的路由