我有一个 Laravel 网站由 代客 关于 backend.test
和a Nuxt SPA on nuxt.backend.test:3005
. 当我尝试认证到 圣殿 与 Nuxt Auth 模块,我得到以下CORS错误。
Access to XMLHttpRequest at 'http:/backend.testlogin'从源头开始'http:/nuxt.backend.test:3005。'已被CORS策略阻止。请求的资源上没有'Access-Control-Allow-Origin'头。
我该如何解决这个问题?
Laravel配置
config/cors.php
:
<?php
return [
'paths' => ['*'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,
];
routes/api.php
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
app/Http/Kernel.php
protected $middlewareGroups = [
...
'api' => [
EnsureFrontendRequestsAreStateful::class,
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
.env
:
SANCTUM_STATEFUL_DOMAINS="backend.test"
SESSION_DOMAIN=".backend.test"
* Nuxt配置nuxt.config.js
:
export default {
server: {
port: '3005',
host: 'nuxt.backend.test'
},
...
modules: [
'@nuxtjs/axios',
'@nuxtjs/auth-next'
],
axios: {
proxy: true
},
proxy: {
'/nuxt': {
target: 'nuxt.backend.test',
pathRewrite: { '^/nuxt': '/' }
}
},
auth: {
redirect: {
callback: '/auth/callback'
},
strategies: {
laravelSanctum: {
provider: 'laravel/sanctum',
url: 'http://backend.test'
}
}
},
...
}
pages/index.php
:
<template>
<div>
<div>
<pre>{{ $auth.user }}</pre>
</div>
<button @click="signIn()">Sign in</button>
</div>
</template>
<script>
export default {
methods: {
signIn() {
this.$auth.loginWith('laravelSanctum', {
data: {
email: '[email protected]',
password: '1qaz@WSX'
}
})
}
}
}
</script>
Laravel 后端和 Nuxt 前台必须在同一个域名下,所以我终于用3个步骤解决了这个问题。
/etc/hosts
:127.0.0.1 nuxt.backend.test
@nuxt/auth
:npm remove @nuxtjs/auth
npm install @nuxtjs/auth-next @nuxtjs/axios
在 nuxt.config.js
,使用。
modules: [
'@nuxtjs/axios',
'@nuxtjs/auth-next'
],
{
axios: {
proxy: true
},
proxy: {
'/laravel': {
target: 'http://backend.test',
pathRewrite: { '^/laravel': '/' }
}
},
auth: {
strategies: {
laravelSanctum: {
provider: 'laravel/sanctum',
url: '/laravel'
}
}
}
}
或者,用下面的配置来代替 backend.test
和 nuxt.backend.test
由 localhost
和去除 Nuxt 服务器 host
从 nuxt.config.js
再用 php artisan serve
而不是 代客 对于 Laravel 也是不错的。