laravel VerifyCsrfToken 除了 url 外还有通配符?
laravel VerifyCsrfToken excepts url with wildcard?
我尝试构建自己的 API。我开始,所以我目前唯一的模型是 "User"。这是我想如何称呼我的 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 将来被许多其他建议使用,所以我更喜欢使用我自己的安全系统(这将是一个 public-私钥对,但现在我只想检查我通过 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',
...
];
}
?>
问题:
你看上面的中间件我有两个问题:
- 我将不得不手动设置所有路线(最后可能会很长)
- 我不知道中间件是否能够处理任何通配符
那么我能否提出一个解决方案,让我可以像 api/*
这样使用 url 通配符?像这样就容易多了!
您可以排除带有 /*
的网址
例如。
您可以使用 api/user/*
而不是 api/user
阅读here
只是一个建议
由于您正在使用 laravel 构建 API,因此您可以将所有 API 路由放在 api.php
路由文件中,而不是 web.php
路由文件中,在这种情况下,您不必为 API 路由上的 post 请求传递 CSRF 令牌。
并且所有 API 路由默认情况下都会像 example.com/api/<route>
一样,您不必将其分组。
你可以阅读更多关于 Laravel 路由 here
乐于助人 :):):)
有时我们使用简单的 URL 或有时 URL/Route 具有一些价值。所以这种情况你可以使用这两个代码。更改文件中的代码
App\Http\Middleware\VerifyCsrfToken.php and $except =[]
for simple Route
$except =['http://127.0.0.2/oams/public/oams/payment/success']
for dynamic Route
// http://127.0.0.2/oams/public/oams/payment/{RandCode}/success
$except =['http://127.0.0.2/oams/public/oams/payment/*']
我尝试构建自己的 API。我开始,所以我目前唯一的模型是 "User"。这是我想如何称呼我的 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 将来被许多其他建议使用,所以我更喜欢使用我自己的安全系统(这将是一个 public-私钥对,但现在我只想检查我通过 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',
...
];
}
?>
问题:
你看上面的中间件我有两个问题:
- 我将不得不手动设置所有路线(最后可能会很长)
- 我不知道中间件是否能够处理任何通配符
那么我能否提出一个解决方案,让我可以像 api/*
这样使用 url 通配符?像这样就容易多了!
您可以排除带有 /*
例如。
您可以使用 api/user/*
api/user
阅读here
只是一个建议
由于您正在使用 laravel 构建 API,因此您可以将所有 API 路由放在 api.php
路由文件中,而不是 web.php
路由文件中,在这种情况下,您不必为 API 路由上的 post 请求传递 CSRF 令牌。
并且所有 API 路由默认情况下都会像 example.com/api/<route>
一样,您不必将其分组。
你可以阅读更多关于 Laravel 路由 here
乐于助人 :):):)
有时我们使用简单的 URL 或有时 URL/Route 具有一些价值。所以这种情况你可以使用这两个代码。更改文件中的代码
App\Http\Middleware\VerifyCsrfToken.php and $except =[]
for simple Route
$except =['http://127.0.0.2/oams/public/oams/payment/success']
for dynamic Route
// http://127.0.0.2/oams/public/oams/payment/{RandCode}/success
$except =['http://127.0.0.2/oams/public/oams/payment/*']