Backend: Laravel + Passport
Frontend: Vue 2.0 + Vuex + Vue-Router
Kann ich access_token
,保存在localStorage
中,那么用戶退出登錄的話需要怎么操作?清空localStorage
erhalten, nachdem ich mich im Frontend angemeldet habe? Muss ich eine weitere Anfrage an das Backend senden?
Wenn der Benutzer nicht zum Abmelden klickt, sondern den Browser oder das Fenster direkt schlie?t, localStorage
里的access_token
ist es beim n?chsten Besuch immer noch vorhanden. In diesem Fall ist die Sicherheit nicht sehr gut, oder?
Mein access_token
ist ein Jahr lang gültig und wird daher jedes Mal neu generiert, wenn ich mich anmelde. Wie kann dieses Problem gel?st werden?
Bitte geben Sie mir einige Ideen zum Umgang mit der Front-End-Benutzerauthentifizierung ... Vielen Dank! ! !
剛好在做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
吧。
認證信息以后臺為準(zhǔn),不管是登錄還是退出都要發(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)用服務(wù)端接口判斷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}});
}
}
});