laravel VerifyCsrfToken 排除带有通配符的url?

Posted

技术标签:

【中文标题】laravel VerifyCsrfToken 排除带有通配符的url?【英文标题】:laravel VerifyCsrfToken excepts url with wildcard? 【发布时间】:2017-08-10 03:27:09 【问题描述】:

我尝试构建自己的 API。我开始了,所以我目前唯一的模型将是“用户”。这是我想调用我的 API 的方式:

HTTP/POST http://example.com/api/user/         # get all the users
HTTP/POST http://example.com/api/user/1        # get the user with id "1"
HTTP/POST http://example.com/api/user/1/delete # delete the user with id "1"
...

所以我的文件routes/web.php 看起来像这样:

<?php    
    Route::group(['prefix' => 'api'], function() 

        Route::group(['prefix' => 'user'], function() 
            Route::post('/', 'ApiController@allUsers');
        );
    );
?>

但它不起作用,因为我没有通过Route::resource 静态方法,而是使用常规Route::post 方法。所以问题是VerifyCsrfToken 中间件将触发并尝试检查我的 CSRF 令牌,但由于我希望我的 api 在未来被许多其他建议使用,我更喜欢使用我自己的安全系统(这将是一个公共的-私钥对,但现在我只想检查我通过 api 分发的数据的完整性,然后我将设置安全算法)。

好消息是 Laravel 非常干净,可以让你将异常 URL 添加到 VerifyCSRFToken 数组中,形状如下:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'api/user',
        'api/user/howCanIManageTheWildCard',
        'api/user/howCanIManageTheWildCard/delete',
        ...
    ];


?>

问题:

您在上面的中间件上看到我有 2 个问题:

    我将不得不手动设置我的所有路线(最后可能很长) 我不知道中间件是否能够处理任何通配符

那么我可以提供一个解决方案,让我做一个像 api/* 这样的 url 通配符吗?这样就容易多了!

【问题讨论】:

【参考方案1】:

您可以排除带有/* 的网址

例如。 而不是api/user,你可以使用api/user/*

阅读here

只是一个建议

由于您使用 laravel 构建 API,您可以将所有 API 路由放入 api.php 路由文件而不是 web.php 路由文件,在这种情况下,您不必传递 CSRF 令牌用于 API 路由的发布请求。 并且所有 API 路由默认情况下都会像 example.com/api/&lt;route&gt;,您不必对其进行分组。 你可以阅读更多关于 Laravel 路由here

乐于助人:):):)

【讨论】:

顺便说一句,您是否将 API 路由移至 api.php 文件,这是推荐的... @Zeratops【参考方案2】:

有时我们使用简单的 URL 或有时 URL/Route 具有一些价值。所以那种情况你可以使用这两个代码。修改文件中的代码

App\Http\Middleware\VerifyCsrfToken.php 和 $except =[]

简单路线

$except =['http://127.0.0.2/oams/public/oams/payment/success']

动态路由

 // http://127.0.0.2/oams/public/oams/payment/RandCode/success
$except =['http://127.0.0.2/oams/public/oams/payment/*']

【讨论】:

以上是关于laravel VerifyCsrfToken 排除带有通配符的url?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 419 错误-VerifyCsrfToken 问题

Laravel 5.1 中的 VerifyCsrfToken.php 第 53 行中的 TokenMismatchException

Laravel - 将 VerifyCsrfToken 添加到控制器获取 ajax 请求

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

TokenMismatchException 在使用 ajax 在 laravel 上的 VerifyCsrfToken.php 第 67 行

VerifyCsrfToken.php 第 67 行中的 TokenMismatchException:同时将 paytm 与 laravel 5.3 集成