需求分析
我们在做用户中心时,对于登录用户签发其对应的token,对token设置他的固定有效期时间。我们通常会遇到一个这样的问题:在有效期内用户携带token访问没问题,当过了有效期后token失效,用户需要重新登录获取新的token。当token时间设置得很短,假如只有10分钟,那么用户当问期间每隔10分钟就要重新登录一次,这样对于用户来说是比较差的体验。
一个App鉴权流程(token刷新机制):
1.活跃的用户应该在无感知的情况下在token失效后获取到新的token,携带这个新的token进行访问,2.不活跃的用户在token失效后需要重新进行登录认证。。
设计思路
用户登录时,为登录用户签发JWT(Json Web Token),并设置JWT的有效时间,同时将该用户的JWT保存至redis缓存中,并设置缓存的有效期,缓存中保存的JWT的有效期要大于JWT本身的有效时间。其中:缓存时间-JWT有效时间=token可刷新时间
Token登录流程
用户进行接口请求时,需要携带token,而此时进行接口请求时通常有以下几种状态:
- 未携带token传入:返回token为空,权限不足;
- 错误token传入:返回token错误,权限不足;
- 正常token传入:通过 。
- 正常token但已过期:查询redis中该token是否存在,如果缓存中存在则刷新token,并将刷新后的token重新放入redis,使用刷新后的token请求资源; 缓存中不存在,则token刷新期限已过,用户需重新登录。
登陆代码
public ResultDTO login(String name, String password) {
Map<String, Object> tokenMap = new HashMap<>();
String token = null;
try {
User user = userMapper.findByUsername(name); //查询用户登录的账号是否存在
if(user == null){
return ResultDTO.failure(new ResultError(UserError.EMP_IS_NULL_EXIT));
}else{
//校验用户密码是否正确
if(!user.getPassword().equals(password)){
return ResultDTO.failure(new ResultError(UserError.PASSWORD_OR_NAME_IS_ERROR));