Token是指代表着用户身份的字符串,当用户进行登录认证后,系统会生成并返回一个Token,以后用户的每一次请求都需要携带该Token以便服务器对其进行身份校验。然而,Token的过期问题是一个需要我们开发人员重视的问题。本文将从多个方面介绍如何处理Token过期问题,给出详细的解决方案。
一、Token过期的原因
1、用户长时间未进行操作,导致Token失效;
2、Token设置的过期时间到期;
3、服务器端的Token存储出现异常。
对于以上原因,我们可以分别进行处理:
二、方案1:Token超时处理
当用户在一段时间内没有进行任何操作,Token就可能失效。解决方法是通过设置一个超时时间,在规定时间内用户没有任何操作则Token失效,需要重新登录获取新的Token,从而保证安全性。
1.在后台服务器设置Token超时时间
//token过期时间:30min const EXPIRE_TIME=30*60*1000;
2.前端请求时校验Token是否过期
let timestamp=Date.now();
let expireTime=localStorage.getItem('expireTime');
if(timestamp-expireTime>EXPIRE_TIME){
console.log('Token已过期,请重新登录!');
logout();//退出登录
}else{
//继续请求操作
}
在请求前需要通过localStorage获取Token的过期时间expireTime,与服务器的当前时间进行比较。若当前时间与过期时间差值大于Token过期时间,则Token失效,需要重新登录,退出当前操作。
三、方案2:禁止多处登录
当用户进行多处登录时,Token也会过期,此时需要提示用户当前设备已登录,禁止重复登录。
1.记录Token登录状态
/**
* 记录Token是否已经登录
* @param {*} token
*/
export function setTokenLoginStatus(token, status = true) {
localStorage.setItem(`token_status_${token}`, status);
}
2.检查Token当前是否已经登录
/**
* 检查Token当前是否已经登录
* @param {*} token
* @returns
*/
export function checkTokenLoginStatus(token) {
return !!localStorage.getItem(`token_status_${token}`);
}
通过localStorage记录每个Token的登录状态。当用户进行多处登录时,后面的登录会将前面的登录Token状态覆盖,此时需要提示用户当前设备已登录,禁止重复登录。
四、方案3:Token过期自动刷新
Token过期,用户需要重新登录获取新的Token,这一过程可能会影响用户体验。为了解决这个问题,可以通过定期刷新获取新的Token,从而保证Token一直有效。
1.前端定期刷新Token
let refreshInterval=50*60*1000;//若前端的Token存在超过50min,定期向服务器请求刷新Token
setInterval(()=>{
refreshToken();
},refreshInterval);
在前端定期刷新Token,若当前Token存在超过规定时间(例如50min),自动向服务器请求刷新Token。此时需要注意,Token刷新的过程要保证前后端的操作的一致性,尤其是在Token刷新存在失败逻辑时需要加入错误处理。
2.后端Token刷新接口
/**
* 刷新Token接口:请求之前需要校验Token过期,通过后则生成新的Token,并存储至Token中
* @param req
* @param res
* @returns {Promise}
*/
async function refreshToken(req, res) {
const token = req.session.token;
const tokenInfo = await verifyToken(token);
const { payload } = tokenInfo;
const { userId, username, platforms, appid } = payload;
let newToken = generateToken(userId, username, platforms, appid);
await saveToken(newToken, userId);
res.json({
code: '000000',
message: 'refresh token success!',
payload: newToken
});
}
在后端编写刷新Token接口,需要先对原Token进行信息解密,获取到原Token所代表的用户信息,然后生成新Token存储至Token中,同时返回给前端。这里需注意,新Token的存储需要替换原Token,以保证Token的一致性,用户不必重新登录。
五、结语
Token过期问题是一个需要开发者思考和解决的实际问题。本文介绍了多种方案:设置Token超时时间、禁止多处登录、定期刷新Token。对于Token过期自动刷新,一定要在前后端操作的一致性上保证,同时还需注意错误处理。通过这些方案,可以使得Token问题得到良好的解决和管理,为后续的开发操作提供了良好的基础和保障。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/159690.html
微信扫一扫
支付宝扫一扫