laravel 7 api CSRF令牌在POST请求上不匹配

时间:2020-11-01 09:47:35

标签: php laravel api

我是对的,我只需要在/app/Http/Middleware/VerifyCsrfToken.php中将api / *路径添加到异常

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
        'api/*',
    ];
}

请参见https://laravel.com/docs/8.x/csrf#csrf-excluding-uris

2 个答案:

答案 0 :(得分:1)

您应将api.php文件用于api路由,因为app/http/kernel.php中默认情况下不会检查csrf_token中间件:

protected $middlewareGroups = [
        'web' => [
          ...
            \App\Http\Middleware\VerifyCsrfToken::class,
          ...
        ],

        'api' => [
            'throttle:60,1',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

答案 1 :(得分:1)

错误是,您已经在routes/web.php上定义了api路由,如果您想在根域中使用/api,则在routes/api.php上创建API路由。

routes / api.php

Route::get('/test', function () {
    return 'Hello World';
});

现在您可以通过http://127.0.0.1:8000/api/test

访问

web.php文件包含 RouteServiceProvider 放置在Web中间件组中的路由,该路由提供会话状态,CSRF保护和cookie加密。如果您的应用程序不提供无状态的RESTful API,则很可能在web.php文件中定义了所有路由。

api.php文件包含 RouteServiceProvider 放在api中间件组中的路由,该中间件组提供了速率限制。这些路由旨在实现无状态,因此通过这些路由进入应用程序的请求旨在通过令牌进行身份验证,并且将无法访问会话状态。

请参阅官方文档 here

相关问题