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

Anw*_*war 4 php api middleware laravel-middleware laravel-5.4

我尝试构建自己的 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"
...
Run Code Online (Sandbox Code Playgroud)

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

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

        Route::group(['prefix' => 'user'], function() {
            Route::post('/', 'ApiController@allUsers');
        });
    });
?>
Run Code Online (Sandbox Code Playgroud)

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

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

<?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',
        ...
    ];
}

?>
Run Code Online (Sandbox Code Playgroud)

题 :

你在上面的中间件上看到我有两个问题:

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

那么我可以提出一个解决方案,让我做一个 url 通配符api/*吗?像这样会轻松很多!

Aks*_*ale 7

您可以使用以下命令排除 URL /*

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

在这里阅读

只是一个建议

由于您正在使用 laravel 构建 API,因此您可以将所有 API 路由放在api.php路由文件而不是web.php路由文件中,在这种情况下,您不必为 API 路由上的 post 请求传递CSRF 令牌example.com/api/<route>默认情况下,所有 API 路由都将如此,您不必对其进行分组。您可以在此处阅读有关 Laravel 路由的更多信息

很高兴能帮助你 :):):)