【问题标题】:csrf_token() is empty in l5-swagger and couldn't do any request except GET requestcsrf_token() 在 l5-swagger 中是空的,除了 GET 请求之外不能做任何请求
【发布时间】:2019-05-20 20:48:22
【问题描述】:

csrf_token() 在 l5-swagger 中是空的,除了 GET 之外不能做任何请求,因为头部丢失并且总是得到 419 错误代码

我尝试向邮递员请求它并且它有效。但大摇大摆地没有。我已经查看了这个链接 (laravel 5 csrf_token value is Empty) 但我仍然不知道如何解决我的问题。

如何在我的 l5-swagger 视图中获取 csrf_token?

【问题讨论】:

    标签: php laravel swagger csrf-token


    【解决方案1】:

    我认为你应该尝试在 /routes/web.php 中添加它

    Route::group(['middleware' => 'web'], function () {
        Route::get('api/documentation', '\L5Swagger\Http\Controllers\SwaggerController@api')->name('l5swagger.api');
    });
    

    所以你可以在 l5-swagger 路由上添加 web 中间件

    希望对你有帮助

    【讨论】:

    • 哇,谢谢!它可以工作,但你能解释更多关于代码的信息吗?
    • 如果你添加了web中间件,那么laravel就会知道你需要csrf token并且csrf_token()值不会为空
    • 啊,我明白了。感谢您的意见
    • 这是配置缺失的错误
    • 不幸的是,这对我来说不适用于 Laravel 8.x,如果你在同一条船上,请查看我的回答
    【解决方案2】:

    对于 Laravel 8.x,使用 Routes 的解决方案对我不起作用。

    相反,我修改了文件config/l5-swagger.php

    您必须向defaults[routes][middleware][api] 添加多个条目。默认情况下,此条目应为空。

    要修复 CSRF 验证,您必须添加:

    ...
    
    'api' => [
        \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,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    
    ...
    

    然后清除配置缓存

    php artisan config:cache
    

    你很高兴!

    【讨论】:

    • 出于某种原因,这对我不起作用。我正在使用最新版本的 laravel 和 L5-swagger
    • 你的结果是什么?
    • 这是 419 错误代码。我已通过将其放入例外列表中来修复它。但是我不确定这是否是最佳做法。
    • 这几乎会禁用 Laravel 的 CSRF 错误。您在通过 Swagger-UI 试用 API 时看到 CSRF-Token 了吗?类似于:-H 'X-CSRF-TOKEN: OmyttElThbpda9aCWnAu2LYR2NOOwDAfdfdsfasdf' 另外:请确保您使用的是 api-routes,而不是 web-routes!
    • 对于任何有同样问题的人,在使用php artisan serve 进行开发并使用带有 L5_SWAGGER_CONST_HOST 的 OA\Server 注释时,请确保此值与 serve 正在执行的操作一致,例如,localhost:8000127.0.0.1:8000 不同
    【解决方案3】:

    这些在 Laravel 8.70.1 中都不适合我。

    对我有用的是在我的本地和开发(无公共访问)环境中禁用 EnsureFrontendRequestsAreStateful::class。然后,在我的部署过程(TeamCity 和 OctoDeploy)到登台和生产的过程中,注释掉的 EnsureFrontendRequestsAreStateful::class 没有注释。

    Swagger 作为部署过程的一部分被禁用到 staging 和 prod 环境。如果您正在构建 SPA,则需要 EnsureFrontendRequestsAreStateful 类。

    总而言之,禁用 EnsureFrontendRequestsAreStateful::class 应该可以解决问题,但请确保将其放回暂存环境和生产环境中。

    要编辑的文件在 /app/Http/Kernel.php 中

       //\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
                'throttle:60,1',
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
                \App\Http\Middleware\AuthGates::class,
    
    
            ],
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 2019-01-15
      • 2013-11-15
      • 1970-01-01
      • 2022-01-18
      • 2018-01-06
      相关资源
      最近更新 更多