为什么 Laravel API 在 POST 和 PUT 方法上返回 419 状态代码?

2022-08-30 11:08:39

我正在尝试使用Laravel创建一个RESTful API。我使用php artisan make:controller RestController创建了我的控制器,这是我的控制器代码:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class RestController extends Controller
{
    private $arr = array(
            array("name"=>"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";
    }

}

我已经添加了这行代码,在我的路由/web.php文件中创建此路由:

Route::resource('person', 'RestController');

当我尝试在GET /person上测试这个API时,它工作正常,但在POST和PUT上,我从Laravel获得了419状态代码。


答案 1

如果您正在开发 REST API,最好不要添加令牌。如果您使用的是 5.4 或 5.5,则可以使用 代替 .在发布请求时,您不需要令牌验证。api.phpweb.phpapi.php

如果您使用的是 ,则可以排除不想使用 CSRF 令牌验证的路由。web.php

以下是官方文档:

从 CSRF 保护中排除 URI

有时,您可能希望从 CSRF 保护中排除一组 URI。例如,如果您使用 Stripe 处理付款并利用其 Webhook 系统,则需要从 CSRF 保护中排除您的 Stripe Webhook 处理程序路由,因为 Stripe 不知道要向路由发送什么 CSRF 令牌。

通常,应将这些类型的路由放在应用于文件中的所有路由的中间件组之外。但是,您也可以通过将路由的 URI 添加到中间件的属性来排除路由:webRouteServiceProviderroutes/web.php$exceptVerifyCsrfToken

<?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 = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}

供参考 https://laravel.com/docs/5.5/csrf


答案 2

根据我的知识,有两种方法可以解决这个问题

方法 1: 添加 CsrF 令牌

方法 2:从 CSRF 保护中排除 URI

如何使用

方法 1: 再向 POST 请求添加一个变量

_token: "{{ csrf_token() }}"

Ajax 示例

req = $.ajax({
    type: "POST",
    url: "/search",
    data: {
        "key": "value",
        _token: "{{ csrf_token() }}",
    },
    dataType: "text",
    success: function(msg) {
        // ...
    }
});

使用表单时的示例

<input type="hidden" name="_token" id="token" value="{{ csrf_token() }}">

方法 2: 有一个文件命名在以下位置VerifyCsrfToken

yourProjectDirectory/app/Http/Middleware

在以下方法中添加您的网址

 protected $except = [
     'url1/',
     'url2/',
 ];

何时使用

  • 如果您是 API 的所有者(完全控制),请使用方法 1,因为 CSRF 令牌可为您的应用程序增加安全性。

  • 如果您无法添加CSRF令牌,例如如果您使用的是任何第三方API,Webhooks等,那么请转到方法2。


推荐