基于jwtToken的简洁的认证中心,前后端分离,对外只提供接口

/ 默认分类 / 0 条评论 / 919浏览

认证中心

认证中心单独作为一个微服务,对外提供生成token的接口(使用用户名和密码生成jwttoken),使用refreshtoken刷新token的接口

  1. 首先需要明确注册中心中token和refreshtoken的几种状态信息

2.说明

因为不方便上代码,所以逻辑就简单描述一下需要注意的几点

/**
     * 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)");
    }