为什么Laravel API在POST和PUT方法上返回419状态码?
为什么Laravel API在POST和PUT方法上返回419状态码?
我正在尝试使用Laravel创建一个RESTful API。我使用php artisan make:controller RestController命令创建了我的控制器,以下是我的控制器代码:
"jon", "family"=>"doe"), array("name"=>"jhon", "family" => "doue") ); public function index(){ return json_encode($this->arr); } public function store(Request $request){ return "oops!!"; } public function update (Request $request, $id){ return "test"; } }
我在routes/web.php文件中添加了以下代码以创建这个路由:
Route::resource('person', 'RestController');
当我尝试在GET /person上测试这个API时,它运行良好,但是在POST和PUT上我从Laravel得到了一个419状态码。
为什么Laravel API在POST和PUT方法上返回419状态码?
如果你正在开发REST API,最好不要添加令牌。如果你使用的是5.4或5.5版本,可以使用api.php
替代web.php
。在api.php
中,你不需要在POST请求上进行令牌验证。
如果你使用的是web.php
,那么你可以排除不需要使用CSRF令牌验证的路由。
以下是官方文档的说明:
从CSRF保护中排除URI
有时,你可能希望从CSRF保护中排除一组URI。例如,如果你正在使用Stripe处理付款并且正在使用他们的Webhook系统,你将需要从CSRF保护中排除Stripe Webhook处理程序路由,因为Stripe不知道要发送到你的路由的CSRF令牌。
通常,你应该将这些路由放在routes/web.php
文件中RouteServiceProvider
应用于所有路由的web
中间件组之外。但是,你也可以通过将URI添加到VerifyCsrfToken
中间件的$except
属性中来排除这些路由:
<?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. * * array */ protected $except = [ 'stripe/*', 'http://example.com/foo/bar', 'http://example.com/foo/*', ]; }
参考链接:https://laravel.com/docs/5.5/csrf
如果我想要添加令牌,我应该使用哪个令牌?
在API中不可能添加Laravel令牌,因为API是从第三方应用程序(如Android、iOS或任何其他Web应用)消费的。
我在我的api.php中添加了Route::resource('person', 'RestController');
,但我仍然收到419状态码。
是的,这是因为没有令牌。你可以尝试在App\Http\Middleware\VerifyCsrfToken
中将protected $except
更改为[ '/*',];
。
Laravel API为什么在POST和PUT方法中返回419状态码?
问题的原因:
在Laravel API中,当使用POST和PUT方法时,返回419状态码的原因是因为缺少CSRF令牌。CSRF令牌是一种用于防止跨站请求伪造攻击的安全机制。如果在请求中没有包含正确的CSRF令牌,Laravel会返回419状态码作为错误提示。
解决方法:
有两种方法可以解决这个问题。
方法一:添加CSRF令牌
在POST请求中添加一个名为_token的额外变量,并将其值设置为CSRF令牌。可以通过以下方式实现:
例如,如果使用Ajax进行请求:
req = $.ajax({ type: "POST", url: "/search", data: { "key": "value", _token: "{{ csrf_token() }}", }, dataType: "text", success: function(msg) { // ... } });
如果使用表单进行请求:
方法二:排除CSRF保护的URI
在Laravel项目的`app/Http/Middleware`目录下有一个名为`VerifyCsrfToken`的文件,可以在其中的`$except`属性中添加需要排除CSRF保护的URI。例如:
protected $except = [ 'url1/', 'url2/', ];
何时使用哪种方法:
- 如果您是API的所有者且具有完全控制权,请使用方法一,因为CSRF令牌可以增加应用程序的安全性。
- 如果您无法添加CSRF令牌,例如使用第三方API或Webhooks等情况,请选择方法二。
我在开发一个JavaScript游戏中的Ajax请求时遇到了这个问题。添加CSRF令牌解决了这个问题,我希望保持它的安全性。
Laravel API在POST和PUT方法上返回419状态码的原因及解决方法
在使用Laravel框架的API开发过程中,有时会遇到POST和PUT方法返回419状态码的问题。这个问题的出现是由于Laravel默认开启了CSRF(跨站请求伪造)保护机制,而在某些情况下,我们可能不需要对特定的路由进行CSRF保护。
要解决这个问题,我们可以通过排除特定路由的CSRF保护来实现。具体的解决方法如下:
1. 打开middleware文件夹,找到名为VerifyCsrfToken.php的文件。
2. 在该文件中找到以下代码片段:
protected $except = [ 'http://127.0.0.1:8000/person/' ];
3. 在$except数组中添加需要排除CSRF保护的路由。例如,如果我们想要排除名为person的路由,可以将其添加到$except数组中:
protected $except = [ 'http://127.0.0.1:8000/person/' 'http://127.0.0.1:8000/other-route' ];
请注意,这里的路由可以是绝对路径,也可以是相对路径。
通过以上步骤,我们成功地解决了Laravel API在POST和PUT方法上返回419状态码的问题。通过排除特定路由的CSRF保护,我们可以在需要的情况下灵活地控制CSRF保护的范围。