tbo*_*den 5 vue.js vue-router vuejs2
我有一个在 Vue 路由器中运行“beforeEnter”的函数来验证用户是否已通过身份验证,否则会触发一条消息。
它检查 (jwt) 是否token保存在localStorage- 如果用户手动注销,这会起作用,因为它会从localStorage. 但是,当令牌过期时,它仍然保留在中,localStorage因此该函数认为 ( (localStorage.token)) 用户已登录。
由于令牌无效,服务器仍然会阻止发出的任何请求 - 因此是安全的。
在页面加载之前,如何在“beforeEnter”中间件中检查服务器端令牌的有效性?
我是否需要创建一个端点来检查令牌有效性并返回结果?(我正在使用 fetch(),但是我见过人们使用 axios 拦截器......)
我没有使用VUEX,这没什么价值,而且似乎有更多细节?
function protectedPage(to, from, next) {
if (localStorage.token) {
next();
} else {
Vue.toasted.show("The session has ended. Please login.", {
theme: "toasted-primary",
position: "top-center",
duration: null,
action: {
text: "Login",
onClick: (e, toastObject) => {
next("/");
toastObject.goAway(0);
}
}
});
next("/");
}
}
Run Code Online (Sandbox Code Playgroud)
由于exp是有效负载的一部分,并且 JWT 只是一个 base64 字符串,因此您可以对其进行解码并检查expVue 应用程序上的时间。
这是一个解码 JWT 令牌并获取有效负载的函数(取自此处)
function parseJwt (token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(Buffer.from(base64, "base64").toString("ascii").split("").map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
};
Run Code Online (Sandbox Code Playgroud)
并检查你的beforeRouteEnter功能:
beforeRouteEnter (to, from, next) {
if (localStorage.token) {
const jwtPayload = parseJwt(localStorage.token);
if (jwtPayload.exp < Date.now()/1000) {
// token expired
deleteTokenFromLocalStorage();
next("/");
}
next();
} else {
next("/");
}
},
Run Code Online (Sandbox Code Playgroud)
您实际上不需要在后端服务器上检查它,因为解码 JWT 令牌有效负载并在客户端检查它不存在安全问题。另外,每次用户访问路由时,它都会为您节省一个 HTTP 请求。
| 归档时间: |
|
| 查看次数: |
7639 次 |
| 最近记录: |