laravel VerifyCsrfToken除了带通配符的url?

时间:2017-03-18 16:11:14

标签: php api middleware laravel-5.4 laravel-middleware

我尝试构建自己的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非常干净,您可以在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',
        ...
    ];
}

?>

问题:

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

  1. 我必须手动设置所有路线(最后可能很长)
  2. 我不知道中间件是否能够处理任何通配符
  3. 那么我可以找到一个可以让我像api/*那样使用网址通配符的解决方案吗?像这样会更容易!

2 个答案:

答案 0 :(得分:2)

您可以排除/*

的网址

EG。 而不是api/user,您可以使用api/user/*

阅读here

只是一个建议

因为您正在使用laravel构建API,所以您可以将所有API路由放在api.php路由文件而不是web.php路由文件中,在这种情况下,您不必传递 CSRF令牌用于API路线上的发布请求。 默认情况下,所有API路线都会像example.com/api/<route>一样,您无需对其进行分组。 您可以阅读有关Laravel路由here

的更多信息

乐意提供帮助:):)):)

答案 1 :(得分:0)

有时我们使用简单的URL,或者有时 URL /路由具有一定的价值。这样您就可以使用这两种代码。更改文件中的代码

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/*']