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

7 浏览
0 Comments

为什么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状态码。

0
0 Comments

为什么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更改为[ '/*',];

0
0 Comments

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令牌解决了这个问题,我希望保持它的安全性。

0
0 Comments

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保护的范围。

0