认证中心
认证中心单独作为一个微服务,对外提供生成token的接口(使用用户名和密码生成jwttoken),使用refreshtoken刷新token的接口
- 首先需要明确注册中心中token和refreshtoken的几种状态信息
2.说明
因为不方便上代码,所以逻辑就简单描述一下需要注意的几点
- refreshtoken生成后是存储在redis中,键为username+"refretoken",值可以是生成的uuid或者其他随机字符串.
- 需要提供两个基础的对外接口
第一个是/token
通过接收到的用户名和密码生成token和refretoken并返回 第二个是/refretoken
通过传入的已经过期的token和用户的refretoken来刷新token和refretoken,判断的逻辑是
/**
* TODO refreshtoken刷新新的token(token有效但过期)
* Created by zuohui
**/
@ApiOperation(value = "reAuthenticateForToken", notes = "刷新token")
@RequestMapping(value="/refreshtoken",method = RequestMethod.GET)
public R<String> reAuthenticateForToken(String token, String refreshToken)
{
String username = JwtUtils.getUsernameFromToken(token);
//如果refreshtoken有效
try{
if(redisTemplate.opsForValue().get(username+"_refreshtoken").equals(refreshToken))
{
//使用旧的有效但是过期的token生成新的token
String newToken = JwtUtils.getNewTokenByOldToken(token);
//生成新的refreshtoken
String newRefreshToken = JwtUtils.getRefreshToken(username+"_refreshtoken");
//使旧的refreshtoken失效,保证每个refreshtoken的一次性使用
redisTemplate.delete(username+"_refreshtoken");
//设置新的refreshtoken到redis
redisTemplate.opsForValue().set(username+"_refreshtoken",newRefreshToken);
redisTemplate.expire(username+"_refreshtoken", ApiGlobalConstants.REFRESHTOKEN_EXPIRETIME_HOUR, TimeUnit.HOURS);
return R.ok()
.message("reauthentication success")
.putExtraData("token",newToken)
.putExtraData("refreshtoken",newRefreshToken);
}
}catch(Exception e)
{
e.printStackTrace();
throw new ApiException(4001,"reauthentication fail)");
}
throw new ApiException(4001,"reauthentication fail)");
}
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为:
2020/05/26 20:45