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 个变体:
- 您可以安装“passport”(这就像您的会话管理器,但没有会话。安装了 em)。喜欢:
php artisan passport:install
.
- 您可以在数据库中创建列,生成令牌并在此处推送它们。
但这不是我们在这里谈论的,对吧?让我们谈谈非常好的解决方案,它适用于 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
编码愉快! :)
我正在尝试构建 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 个变体:
- 您可以安装“passport”(这就像您的会话管理器,但没有会话。安装了 em)。喜欢:
php artisan passport:install
. - 您可以在数据库中创建列,生成令牌并在此处推送它们。
但这不是我们在这里谈论的,对吧?让我们谈谈非常好的解决方案,它适用于 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
编码愉快! :)