我试图建立一个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)
好吧,我花了 2-3 个小时来解决这个问题,并在 python 上编写检查器来配置那个问题不在我身上。
默认情况下,laravel API 仅适用于“令牌”。如果你想使用这个能力,你应该考虑这两个变体:
php artisan passport:install。但这不是我们在这里谈论的,对吧?让我们谈谈非常好的解决方案,它适用于所有 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
快乐编码!:)
| 归档时间: |
|
| 查看次数: |
10091 次 |
| 最近记录: |