Backend:Laravel + Passport
Frontend:Vue 2.0 + Vuex + Vue-router
前端登陸后獲取access_token
,保存在localStorage
中,那么用戶退出登錄的話需要怎么操作?清空localStorage
嗎?是否需要向后端再發(fā)送請求?
如果用戶沒有點擊退出登錄,而是直接關(guān)閉瀏覽器或者窗口呢,下次訪問時,localStorage
里的access_token
依然存在,這樣的話安全性不太好吧?
我的access_token
的有效期是一年,那么每次登錄都會重新生成,這個怎么解決?
求前端用戶認證的處理思路……萬分感謝?。?!
剛好在做JWT的驗證,用axios和router做驗證,暫時還未完成,先貼一部分代碼參考
import Vue from 'vue'
import axios from 'axios'
var http = axios.create({
baseURL: process.env.API_URL
});
http.init = function () {
http.interceptors.request.use(config => {
this.load = true;
if (localStorage.JWT_TOKEN) {
config.headers = {'Authorization': localStorage.JWT_TOKEN};
}
return config;
}, err => {
this.load = false;
console.error(err);
});
http.interceptors.response.use(res => {
this.load = false;
if (res.data.code === 1) {
return res.data.data;
} else {
if (res.data.code == 4) {
localStorage.removeItem('JWT_TOKEN');
this.$router.push('/Login');
alert(res.data.msg);
} else if (res.data.code == 401) {
localStorage.removeItem('JWT_TOKEN');
this.$router.push('/Login');
} else {
throw new Error(res.data.msg);
}
}
}, err => {
this.load = false;
throw new Error(res.data.msg);
});
}
Vue.prototype.$http = http;
import Vue from 'vue'
import Router from 'vue-router'
function include (name) {
return resolve => require(['components/' + name], resolve);
}
function route (name) {
return {
name: name,
path: name,
component: include(name)
}
}
Vue.use(Router);
var router = new Router({
base: '/admin/',
mode: 'history',
routes: [
{
name: 'Index',
path: '/',
component: include('Index'),
children: [
{
name: 'User',
path: 'User/:page/:rows',
component: include('User')
}
]
},
{
name: 'Login',
path: '/Login',
component: include('Login')
},
{
path: '*',
redirect: '/'
}
]
})
router.beforeEach(({name}, from, next) => {
if (localStorage.JWT_TOKEN) {
if (name == 'Login') {
next('/');
} else {
next();
}
} else {
if (name == 'Login') {
next();
} else {
next({name: 'Login'});
}
}
});
export default router;
退出時刪除localStorage
中的access_token
。
可以給Vuex寫個插件,每次commit
mutation
時,更新一下access_token
的刷新時間。
下次登錄時,判斷這個刷新時間,5分鐘前了,就認為登錄信息過期了。
如果不想把access_token
放到localStorage
中,可以放在Vuex中,每次都需要重新登錄。access_token
放到localStorage
中,可以放在Vuex中,每次都需要重新登錄。
重新登錄時,你可以沒必要都重新生成access_token
重新登錄時,你可以沒必要都重新生成access_token
吧。
認證信息以后臺為準,不管是登錄還是退出都要發(fā)送請求,然后根據(jù)api返回的結(jié)果前端進行操作,如果不記住認證信息用sesionStorage好點
設(shè)置路由的攔截器,攔截除了login和logout的所有頁面,檢查本地變量user是否存在,存在則判斷上次校驗時間,如果超出1分鐘則重新校驗。
router.beforeEach((to, from, next) => {
// to 和 from 都是 路由信息對象
//var auth = to.matched[0].default.auth;
//console.log(to);
if (to.path =="/login" || to.path =="/logout") {
next();
}
else {
const user = store.state.system.user;
if(user){
const time = new Date().getTime();
if(time-user.lastCheckTime > 60*1000){ // 如果上次檢查時間大于1分鐘,則調(diào)用服務端接口判斷session 是否依然有效
store.dispatch("checkLogin",(error,isLogined)=>{ // 異步檢查是否狀態(tài)有效
if(error || !isLogined){
console.warn("登錄超時");
next({'path':'/login',query:{backUrl:to.fullPath}});
}
else{
next();
}
});
}
else{
next();
}
}
else{
console.warn("需要登錄");
next({'path':'/login',query:{backUrl:to.fullPath}});
}
}
});