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

新手上路,请多包涵

我正在尝试使用 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";
    }

}

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

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

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

原文由 Navid_pdp11 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

如果您正在开发 REST API,最好不要添加令牌。如果您使用的是 5.4 或 5.5,则可以使用 api.php 而不是 web.php 。在 api.php 您不需要对发布请求进行令牌验证。

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

这是官方文档:

从 CSRF 保护中排除 URI

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

通常,您应该将这些类型的路由放在 web 中间件组之外 RouteServiceProvider 适用于 routes/web.php 文件中的所有路由。但是,您也可以通过将它们的 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.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}

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

原文由 Vision Coderz 发布,翻译遵循 CC BY-SA 4.0 许可协议

当向 Laravel API 发出 POST 请求时,我遇到了同样的问题。

我解决了在 headers 请求中发送 Accept: application/json 的问题。

原文由 pableiros 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题