Laravel 5.3 - 如何在没有 CSRF 的情况下将会话添加到 `API`?

Laravel 5.3 - How to add Sessions to `API` without CSRF?

我正在尝试构建 api,出于某种原因,我需要会话。但是,如果我包含 web 中间件,我会收到 CSRF 错误,如果我不包含,我将无法启动 session

如何解决?

转到 app/Http/Kernel.php 并将您自己的名称添加到 $middlewareGroups,例如 'sessions'。它应该包含 \Illuminate\Session\Middleware\StartSession::class,

将 'sessions' 分配给您想要的路线。

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],

        'api' => [
            'throttle:60,1',
        ],

        'sessions' => [
            \Illuminate\Session\Middleware\StartSession::class,
        ]
    ];

routes/api.php

Route::group(['middleware' => ['sessions']], function () {
    Route::resource(...);
});

要修复 Laravel 6.x,您可以使用此处的解决方案

打开app\kernel.php

添加\Illuminate\Session\Middleware\StartSession::class,

变成'api' => [ 'throttle:60,1', 'bindings', ],

最终结果如下:

'api' => [ 
   \Illuminate\Session\Middleware\StartSession::class, 
   'throttle:60,1', 
   'bindings',
],

当您检查 api 回复时,您会看到 header 中设置的 cookie。

我在这里得到了解决方案 >> https://laravel.io/forum/laravel-api-using-session-issue

居然帮我完美解决了

好吧,我花了 2-3 个小时来解决这个问题并在 python 上编写检查器来配置那个问题不在我身上。

但是,让我们谈谈 laravel API 以及它是如何工作的。

默认情况下 laravel API 仅适用于“令牌”。如果你想使用这个能力,你应该考虑这 2 个变体:

  1. 您可以安装“passport”(这就像您的会话管理器,但没有会话。安装了 em)。喜欢:php artisan passport:install.
  2. 您可以在数据库中创建列,生成令牌并在此处推送它们。

但这不是我们在这里谈论的,对吧?让我们谈谈非常好的解决方案,它适用于 laravel.

的所有版本

有一个文件,名为 Kernel.php。它们是为配置您的应用程序而创建的。默认情况下,所有 API 路由都将使用此规则:

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

如果你愿意,你可以看看这个中间件是关于什么的。 因此,下一步是重新创建 'api' 规则。

你想API做什么?用会话验证所有?是否使用 CSRF 验证所有内容?只看这里:

        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

这是WEB路由的配置。您可以看到一些有趣的中间件,例如: \App\Http\Middleware\VerifyCsrfToken::class。现在你明白了吧?

针对您的 API 的修复应该如下所示:

        'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:api',
        ],

如果你想使用 CSRF:

        'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
             App\Http\Middleware\VerifyCsrfToken::class,
            'throttle:api',
        ],

默认情况下,控制您的操作的基本规则(守卫)是在 config\auth.php 创建的,看起来像(对于 api 和网络):

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],

如果你希望以后不会有任何问题,这个API,你应该用同样的方式改变这个'rules':

        'api' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

请不要忘记 CLEAR 全部,除了这里的 .gitignore:/storage/framework/sessions


编码愉快! :)