【发布时间】:2019-09-08 21:06:05
【问题描述】:
注意:我已经分离了我的客户端(Vue.js)和服务器(DjangoRest)。 我正在使用 JWT 验证从客户端向服务器发出的每个请求。 流动- 客户端将用户凭据发送到服务器。如果凭据有效,服务器会发回刷新和访问令牌。客户端存储访问和刷新令牌。 我已将刷新令牌到期时间设置为 1 周,访问时间为 30 分钟。接下来,我想确保访问令牌在到期前 15 分钟自动刷新。为此,将存储在客户端的刷新令牌发送到服务器,然后服务器发出新的访问令牌和刷新令牌,将其发送回客户端。我如何在 Vuex 商店中实现这一点?我是 web 开发和 vue.js 的新手。如果有人能提供一些代码或详细解释,那就太好了。
我已经在商店中实现了 loginUser、logout user、registerUser 并且它们工作正常。但我坚持使用自动刷新逻辑。 我的猜测是客户端必须反复检查剩余的访问令牌到期时间。剩下大约 15 分钟时,我们必须初始化自动刷新功能。请帮我解决这个逻辑。
这是我的 Vueex 商店:
import Vue from 'vue'
import Vuex from 'vuex'
import axiosBase from './api/axios-base'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
accessToken: '' || null,
refreshToken: '' || null
},
getters: {
loggedIn (state) {
return state.accessToken != null
}
},
mutations: {
loginUser (state) {
state.accessToken = localStorage.getItem('access_token')
state.refreshToken = localStorage.getItem('refresh_token')
},
destroyToken (state) {
state.accessToken = null
state.refreshToken = null
}
},
actions: {
registerUser (context, data) {
return new Promise((resolve, reject) => {
this.axios.post('/register', {
name: data.name,
email: data.email,
username: data.username,
password: data.password,
confirm: data.confirm
})
.then(response => {
resolve(response)
})
.catch(error => {
reject(error)
})
})
},
// fetch data from api whenever required.
backendAPI (context, data) {
},
logoutUser (context) {
if (context.getters.loggedIn) {
return new Promise((resolve, reject) => {
axiosBase.post('/api/token/logout/')
.then(response => {
localStorage.removeItem('access_token')
localStorage.removeItem('refresh_token')
context.commit('destroyToken')
})
.catch(error => {
context.commit('destroyToken')
resolve()
})
})
}
},
autoRefresh (context, credentials) {
},
loginUser (context, credentials) {
return new Promise((resolve, reject) => {
axiosBase.post('/api/token/', {
username: credentials.username,
password: credentials.password
})
.then(response => {
localStorage.setItem('access_token', response.data.access)
localStorage.setItem('refresh_token', response.data.refresh)
context.commit('loginUser')
resolve(response)
})
.catch(error => {
console.log(error)
reject(error)
})
})
}
}
})
提前谢谢你。
【问题讨论】:
-
你的代码在哪里? Read how to ask questions
-
现在添加检查。但是,问题更多的是关于想法/逻辑
标签: javascript authentication vue.js jwt refresh-token