php 如何在Laravel API中修复Capacitor/Quasar应用程序的CORS

bttbmeg0  于 2023-06-04  发布在  PHP
关注(0)|答案(1)|浏览(264)

我有一个基于Quasar和Capacitor构建的应用程序,其中一个API构建在Laravel之上。在开发环境中一切都运行良好,直到我在手机上构建并安装应用程序,然后我一直超时,决定构建一个SPA并使用Liteserver运行它,结果发现服务器返回了一个:“Access to XMLHttpRequest at 'https://smk.toneflix.com.ng/api/pages/about' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.“错误。
在我的Kernel.php上,我有这个:

protected $middleware = [
    // \App\Http\Middleware\TrustHosts::class,
    \App\Http\Middleware\TrustProxies::class,
    \Illuminate\Http\Middleware\HandleCors::class,
    \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

在我的cors.php配置文件中,我还有这个:

return [
    'paths' => ['*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['*'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,

];

我在sanctum.php配置中也有这个

return [
    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        '%s%s',
        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
        Sanctum::currentApplicationUrlWithPort(),
        env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '',
        env('FRONTEND_URL') ? ','.parse_url(env('FRONTEND_URL'), PHP_URL_HOST) : ''
    ))),
    ...
]

我已经尝试了其他几个配置选项,以及其他SO答案的建议,但没有帮助。Postman中的一切都可以正常工作,如果我在API域上创建一个子域并托管一个SPA,但这不是我想要的,当在真实的设备上运行时,我需要在本机应用程序上通过请求。

编辑

我发现我的设备从https://localhost发出请求,所以我将其添加到FRONTEND_URL环境变量中,它工作了,但我确实明白这是不可持续的,因为我无法控制我的应用程序将在哪里运行,所以我不认为这是一个修复方案。

用于上下文

以下是我的默认Axios设置:

let headers = {
  "Accept": "application/json",
  "X-Requested-With": "XMLHttpRequest",
  "Access-Control-Allow-Credentials": "true",
  "Content-Type": "application/json; charset=utf-8",
  "X-Requested-With": "XMLHttpRequest",
  "SameSite": "None",
};

axios.defaults.withCredentials = true;
const api = axios.create({
  baseURL: "http://127.0.0.1:8000/api/",
  headers,
});

更新

Taylor奥特韦尔实际上是在我在Twitter上提到他之后才提出这个问题的,这是一个很长的线程,很多人提供了帮助,在与另一位Twitter用户进行Anydesk会话后,我们得出结论,这可能是一个服务器问题,因为即使使用实时API,在开发设置中,一切似乎都运行良好,我将尝试其他部署选项,看看哪些有效,并根据需要进行更新。

最后更新

已经过了3天又2天了,我的交货期限,原来一切都很完美,我的手机是因为我还不知道的原因搞砸了。我决定在Appetize平台上运行该应用程序,它的表现完美无瑕。感谢所有在这个紧急时刻帮助我的人。和平。

gpnt7bae

gpnt7bae1#

您的cors.php配置文件应该如下所示:

return [

    'paths' => ['api/*', 'sanctum/csrf-cookie'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['*'],

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => [],

    'max_age' => 0,

    'supports_credentials' => false, //This can be true or false

];

在kernel.php文件中删除\Illuminate\Http\Middleware\HandleCors::class,并使用\Fruitcake\Cors\HandleCors::class,
将此"fruitcake/laravel-cors": "^2.0",添加到composer.json文件中,然后运行composer install
然后,删除Axios上的一些头对象,并允许Axios为您设置它们,除非您想自定义它们。例如:

const api = axios.create({
  baseURL: "http://127.0.0.1:8000/api/",
  headers: {
          Authorization: `Bearer ${token}`, //This is optional
          "Content-Type": "application/json",
        },
});

确保在完成所有这些操作后重新启动laravel本地服务器。

相关问题