Nuxt 项目在尝试通过 Laravel Sanctum 登录用户时抛出 CSRF 令牌不匹配 419 错误

sat*_*pse 6 laravel vue.js nuxt.js laravel-sanctum

项目结构:

2个文件夹,即apiand client,其中 api 用于 laravel 安装,client 指的是 nuxt 项目。

Laravel (v-8.00) 设置:

这是我在.env文件中的会话变量

SESSION_DRIVER=cookie
SESSION_LIFETIME=120
SESSION_DOMAIN=127.0.0.1
SANCTUM_STATEFUL_DOMAINS=127.0.0.1:3000
Run Code Online (Sandbox Code Playgroud)

cors.php 包含以下内容

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

'allowed_methods' => ['*'],

'allowed_origins' => ['*'],

'allowed_origins_patterns' => [],

'allowed_headers' => ['*'],

'exposed_headers' => false,

'max_age' => true,

'supports_credentials' => true,
Run Code Online (Sandbox Code Playgroud)

没有sanctum.php对它进行任何更改,它包含

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1,127.0.0.1:8000,::1')),
Run Code Online (Sandbox Code Playgroud)

Nuxt 设置

.env 文件包含:

PORT=3000
HOST=127.0.0.1
BASE_URL=http://127.0.0.1:3000
API_URL=http://127.0.0.1:8000
Run Code Online (Sandbox Code Playgroud)

nuxt.config.js 包含:

modules: [
    '@nuxtjs/axios',
    '@nuxtjs/auth-next',
    '@nuxtjs/pwa',
    '@nuxtjs/dotenv',
],
/*
** Axios module configuration
** See https://axios.nuxtjs.org/options
*/
axios: {
    baseUrl: process.env.API_URL,
    credentials: true,
},

auth: {
    strategies: {
    cookie: {
        cookie: {
        name: 'XSRF-TOKEN',
        }
    },
        'laravelSanctum': {
        provider: 'laravel/sanctum',
        url: process.env.API_URL
        },
    },
    redirect: {
        login: '/login',
        logout: '/login',
        callback: '/login',
        home: '/'
    }
},
Run Code Online (Sandbox Code Playgroud)

Login.vue 已

    data() {
        return {
            form: {
                email: '',
                password: ''
            },
            errors: {}
        }
    },

    methods: {
        async submit () {
            this.$auth.loginWith('laravelSanctum', { data: this.form })
            .then(response => {
                this.$router.push(`/`)
            })
            .catch(({response}) => {
                this.errors = response.data.errors
            })

        }
    },
Run Code Online (Sandbox Code Playgroud)

回应

这是我在尝试登录用户时得到的回应:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

pkt*_*ndu 2

我知道这是一个老问题。但我自己也遇到了这个问题,我想我应该分享对我有用的东西。

显然,设置SESSION_DOMAIN=127.0.0.1会引发419“CSRF 令牌不匹配”错误。

但是,如果将其设置为SESSION_DOMAIN=localhost,则效果很好。