Vuex 持久化认证状态
Vuex persist authenticated status
我正在使用 Vuex 和 Laravel sanctum 来验证用户。下面是我的 Vuex auth.js
import axios from 'axios'
export default {
namespaced: true,
state:{
authenticated: false,
user: null
},
getters:{
authenticated (state) {
return state.authenticated
},
user (state) {
return state.user
}
},
mutations:{
SET_AUTHENTICATED(state, value){
state.authenticated = value
},
SET_USER(state, data){
state.user = data
}
},
actions:{
async login ({commit}, credentials){
await axios.get('/sanctum/csrf-cookie')
await axios.post('/api/login', credentials).then(response => {
commit('SET_AUTHENTICATED', true)
commit('SET_USER', response.data)
}).catch(() => {
commit('SET_AUTHENTICATED', false)
commit('SET_USER', null)
})
},
}
}
身份验证有效,但每次我刷新页面时,身份验证状态都默认恢复为 false。如何确保如果用户通过身份验证,身份验证状态保持为真?
持久化数据有两种可能的选择:您可以使用 cookie 或本地存储。这两个选项都经常使用,例如 Nuxt Auth.
持久存储的一个简单选择是使用 vuex-persist
。您可以找到入门指南 here.
假设您要从 API 取回一个 令牌,您可以将其存储在本地存储中。
state: {
authenticated: false,
user: null,
token: localStorage.getItem('token') || '',
},
actions:{
await axios.post('/api/login', credentials).then(response => {
const token = response.data.token
localStorage.setItem('token', token)
})
}
您可以通过 Axios 拦截器处理过期令牌:
created () {
this.$axios.interceptors.response.use(undefined, function (err) {
return new Promise(function (resolve, reject) {
if (err.status === 401) {
this.$store.dispatch(logout)
}
throw err;
});
});
}
Vuex 注销操作
logout({commit}){
return new Promise((resolve, reject) => {
commit('logout')
localStorage.removeItem('token')
delete axios.defaults.headers.common['Authorization']
resolve()
})
}
@studio-pj。我认为将令牌存储在 LocalStorage 中是不安全的,因为它是用户凭据。
我读到的有关 LocalStorage 的所有内容都是它不应该用于登录凭据和其他安全敏感数据。
我正在使用 Vuex 和 Laravel sanctum 来验证用户。下面是我的 Vuex auth.js
import axios from 'axios'
export default {
namespaced: true,
state:{
authenticated: false,
user: null
},
getters:{
authenticated (state) {
return state.authenticated
},
user (state) {
return state.user
}
},
mutations:{
SET_AUTHENTICATED(state, value){
state.authenticated = value
},
SET_USER(state, data){
state.user = data
}
},
actions:{
async login ({commit}, credentials){
await axios.get('/sanctum/csrf-cookie')
await axios.post('/api/login', credentials).then(response => {
commit('SET_AUTHENTICATED', true)
commit('SET_USER', response.data)
}).catch(() => {
commit('SET_AUTHENTICATED', false)
commit('SET_USER', null)
})
},
}
}
身份验证有效,但每次我刷新页面时,身份验证状态都默认恢复为 false。如何确保如果用户通过身份验证,身份验证状态保持为真?
持久化数据有两种可能的选择:您可以使用 cookie 或本地存储。这两个选项都经常使用,例如 Nuxt Auth.
持久存储的一个简单选择是使用 vuex-persist
。您可以找到入门指南 here.
假设您要从 API 取回一个 令牌,您可以将其存储在本地存储中。
state: {
authenticated: false,
user: null,
token: localStorage.getItem('token') || '',
},
actions:{
await axios.post('/api/login', credentials).then(response => {
const token = response.data.token
localStorage.setItem('token', token)
})
}
您可以通过 Axios 拦截器处理过期令牌:
created () {
this.$axios.interceptors.response.use(undefined, function (err) {
return new Promise(function (resolve, reject) {
if (err.status === 401) {
this.$store.dispatch(logout)
}
throw err;
});
});
}
Vuex 注销操作
logout({commit}){
return new Promise((resolve, reject) => {
commit('logout')
localStorage.removeItem('token')
delete axios.defaults.headers.common['Authorization']
resolve()
})
}
@studio-pj。我认为将令牌存储在 LocalStorage 中是不安全的,因为它是用户凭据。 我读到的有关 LocalStorage 的所有内容都是它不应该用于登录凭据和其他安全敏感数据。