J'ai un site Web Laravel servi par Valet sur backend.test
et un Nuxt SPA sur nuxt.backend.test:3005
. Lorsque j'essaye de m'authentifier auprès de Sanctum avec Nuxt Auth module, j'obtiens l'erreur CORS ci-dessous:
L'accès à XMLHttpRequest à ' http: //backend.test/login ' from Origin ' http: //nuxt.backend.test: 3005 ' a été bloqué par la politique CORS : Aucun en-tête "Access-Control-Allow-Origin" n'est présent sur la ressource demandée.
Comment puis-je y remédier?
Configuration de 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"
Configuration 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 backend et Nuxt frontend doivent être sous le même domaine, donc je l'ai finalement corrigé en 3 étapes:
/etc/hosts
:127.0.0.1 nuxt.backend.test
@nuxt/auth
:npm remove @nuxtjs/auth
npm install @nuxtjs/auth-next @nuxtjs/axios
Dans nuxt.config.js
, utilisation:
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'
}
}
}
}
Vous pouvez également remplacer backend.test
et nuxt.backend.test
par localhost
et en supprimant Nuxt serveur Host
de nuxt.config.js
puis utilisez php artisan serve
au lieu de Valet for Laravel c'est bien aussi.