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

Rah*_*san 2 php laravel-5.3

我试图建立一个api,由于某种原因,我需要会议.但如果我包含web中间件,我会收到CSRF错误,如果我不能session开始.

怎么解决这个?

小智 12

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

将"会话"分配给您想要的路线.

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,
        ]
    ];
Run Code Online (Sandbox Code Playgroud)

路线/ api.php

Route::group(['middleware' => ['sessions']], function () {
    Route::resource(...);
});
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的。在 Spark 5 上使用 Laravel 5.5。尝试检测 API 路由中的模拟,并在尝试使用“session('spark:impersonator')”获取 'spark:impersonator' 会话变量时返回 null。 (5认同)

r1v*_*v3n 5

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

但是,让我们谈谈 laravel API 及其工作原理。

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

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

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

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

        'api' => [
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
Run Code Online (Sandbox Code Playgroud)

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

你想 API 做什么?使用会话验证所有内容?使用 CSRF 或不使用 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,
        ],
Run Code Online (Sandbox Code Playgroud)

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

您的 API 的修复应如下所示:

        'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:api',
        ],
Run Code Online (Sandbox Code Playgroud)

如果你想使用 CSRF:

        'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
             App\Http\Middleware\VerifyCsrfToken::class,
            'throttle:api',
        ],
Run Code Online (Sandbox Code Playgroud)

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

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

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
Run Code Online (Sandbox Code Playgroud)

如果您希望将来这个 API 没有任何问题,您应该以相同的方式更改此“规则”:

        'api' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
Run Code Online (Sandbox Code Playgroud)

并且请不要忘记清除所有,除了 .gitignore 在这里:/storage/framework/sessions


快乐编码!:)