laravel #vue.js #laravel-sanctum
#laravel #vue.js #laravel-sanctum
Вопрос:
Я использую vue и laravel в проекте, у меня настроено sanctum в laravel, при обновлении страницы данные удаляются, я получаю несанкционированное сообщение. Я попытался установить vuex-persistedstate в проекте, но это не сработало, я также пытался создать перехватчик для чтения токена, который хранится в localStorage, но ничего.
Проблема в том, что когда я снова перезагружаю страницу, запросы, которые она отправляет в API, кажутся потерянными, и вам нужно снова войти в систему, показывает мне не прошедший проверку подлинности
Я использую vuex.
configuration .env:
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost
SESSION_DRIVER=cookie
Конфигурация пути URL-адреса Api:
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')
}
Комментарии:
1. Во-первых, я бы рекомендовал не жестко кодировать домен / порт для ваших вызовов axios. Во-вторых, вы добавили
localhost:8000
вSANCTUM_STATEFUL_DOMAINS
домены?2. да, я уже добавил это, но это не сработало
Ответ №1:
вход в систему sanctum зависит от файлов cookie, а не от локального хранилища, которое вы должны добавить with_credential: true
в параметры axios, и хорошо использовать эту библиотеку для аутентификации https://www.npmjs.com/package/vue-sanctum
Комментарии:
1. Добавляя учетные данные, я получаю следующее: запрос от другого источника заблокирован: политика того же источника запрещает чтение удаленного ресурса по адресу ‘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, '')}`
}
})
}
Я получаю доступ из локального хранилища, и каждый раз, когда страница перезагружается, информация обновляется и больше не отображается несанкционированно