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问题得到良好的解决和管理,为后续的开发操作提供了良好的基础和保障。