当页面更新时,数据被删除 - vue 和 laravel sanctum

Posted

技术标签:

【中文标题】当页面更新时,数据被删除 - vue 和 laravel sanctum【英文标题】:When the page is updated the data is deleted - vue and laravel sanctum 【发布时间】:2022-01-06 11:17:06 【问题描述】:

我在项目中使用 vue 和 laravel,我在 laravel 中配置了 sanctum,当我更新页面时,数据被删除,我收到一条未经授权的消息。我试图在项目中设置vuex-persistedstate,但它不起作用,我还试图创建一个拦截器来读取存储在localStorage中的令牌但没有。

问题是当我再次重新加载页面时,它对 api 的请求似乎丢失了,你必须再次登录,未验证显示我

我正在使用 vuex。

配置.env:

SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost
SESSION_DRIVER=cookie

Api url路径配置:

export default 
  state: 
    apiURL: 'http://localhost:8000/api',
    serverPath: 'http://localhost:8000',
  ,
  mutations: ,
  actions: ,

常规 vuex 设置:

import Vue from 'vue'
import Vuex from 'vuex'

// Modules
import ecommerceStoreModule from '@/views/apps/e-commerce/eCommerceStoreModule'
import app from './app'
import api from './api'
import appConfig from './app-config'
import verticalMenu from './vertical-menu'

Vue.use(Vuex)

export default new Vuex.Store(
  modules: 
    app,
    api,
    appConfig,
    verticalMenu,
    'app-ecommerce': ecommerceStoreModule,
  ,
  strict: process.env.DEV,
)

这是登录文件配置的一部分:

if (success) 
      axios.get('http://localhost:8000/api/auth/sanctum/csrf-cookie')
        .then(() => 
          axios.post('http://localhost:8000/api/auth/login', 
            email: this.userEmail,
            password: this.password,
          ).then(resp => 
            const login = resp.data
            const tokenOriginal = login.accessToken
            const token = tokenOriginal.replace(/["']/g, '')

            localStorage.setItem('accessToken', JSON.stringify(token))
            localStorage.setItem('refreshToken', JSON.stringify(token))

            axios.defaults.headers.common.Authorization = `Bearer $token`
            axios.defaults.headers.common.Accept = 'application/json'

            axios.get('http://localhost:8000/api/user')

              .then(response => 
                const user = response.data.data
                const  role  = user

                localStorage.setItem('userData', JSON.stringify(user))

                this.$ability.update(user.ability)

axios 配置文件:

import axios from 'axios'
import store from '@/store/index'

export function http() 
  return axios.create(
    baseURL: store.state.api.apiURL,
  )


export function httpFile() 
  return axios.create(
    baseURL: store.state.api.apiURL,
    headers: 
      'Content-Type': 'multipart/form-data',
    ,
  )

配置文件路径:

export default 
  state: 
    apiURL: 'http://localhost:8000/api',
    serverPath: 'http://localhost:8000',
  ,
  mutations: ,
  actions: ,

服务文件:

import  http  from '../http_service'

// Inventory
export function getInventories() 
    return http().get('/store_inventory')

【问题讨论】:

首先,我建议不要为您的 axios 调用硬编码域/端口。其次,您是否将localhost:8000 添加到SANCTUM_STATEFUL_DOMAINS 域? 是的,我已经添加了,但是没有用 【参考方案1】:

sanctum 登录依赖于 cookie 而不是本地存储 您必须将 with_credential: true 添加到 axios 选项 并且使用这个库进行身份验证很好https://www.npmjs.com/package/vue-sanctum

【讨论】:

添加 withCredentials 我得到这个:来自其他来源的请求被阻止:同源策略阻止在“http://localhost:8000/api/cost_centers”读取远程资源(原因:如果 CORS 不支持凭证标头'Access-Control-Allow-Credentials'它是'*')。【参考方案2】:

我通过将标头添加到 axios 配置来解决它:

import axios from 'axios'
import store from '@/store/index'

export function http() 
 return axios.create(
 baseURL: store.state.api.apiURL,
 headers: 
   'Content-Type': 'application/json',
   'Accept': 'application/json',
   'Authorization': `Bearer 
   $localStorage.getItem('accessToken').replace(/['"]+/g, '')`
  
 )

我从本地存储中获取 accessToken 并且每次重新加载页面时都会刷新信息并且不再出现未经授权

【讨论】:

以上是关于当页面更新时,数据被删除 - vue 和 laravel sanctum的主要内容,如果未能解决你的问题,请参考以下文章

Vue3声明周期的理解

vue2笔记

Vue入门

vue实现不刷新整个页面刷新数据

vue 按钮 权限控制

vue实现不刷新整个页面刷新数据