刷新token修改

This commit is contained in:
macro
2019-11-13 13:47:28 +08:00
parent 07f9a00deb
commit 2cf33d0820
6 changed files with 69 additions and 15 deletions

View File

@@ -63,13 +63,13 @@ public class UmsAdminController {
} }
@ApiOperation(value = "刷新token") @ApiOperation(value = "刷新token")
@RequestMapping(value = "/token/refresh", method = RequestMethod.GET) @RequestMapping(value = "/refreshToken", method = RequestMethod.GET)
@ResponseBody @ResponseBody
public CommonResult refreshToken(HttpServletRequest request) { public CommonResult refreshToken(HttpServletRequest request) {
String token = request.getHeader(tokenHeader); String token = request.getHeader(tokenHeader);
String refreshToken = adminService.refreshToken(token); String refreshToken = adminService.refreshToken(token);
if (refreshToken == null) { if (refreshToken == null) {
return CommonResult.failed(); return CommonResult.failed("token已经过期");
} }
Map<String, String> tokenMap = new HashMap<>(); Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", refreshToken); tokenMap.put("token", refreshToken);

View File

@@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -23,6 +24,8 @@ import java.util.Map;
@Api(tags = "UmsMemberController", description = "会员登录注册管理") @Api(tags = "UmsMemberController", description = "会员登录注册管理")
@RequestMapping("/sso") @RequestMapping("/sso")
public class UmsMemberController { public class UmsMemberController {
@Value("${jwt.tokenHeader}")
private String tokenHeader;
@Value("${jwt.tokenHead}") @Value("${jwt.tokenHead}")
private String tokenHead; private String tokenHead;
@Autowired @Autowired
@@ -68,4 +71,19 @@ public class UmsMemberController {
@RequestParam String authCode) { @RequestParam String authCode) {
return memberService.updatePassword(telephone,password,authCode); return memberService.updatePassword(telephone,password,authCode);
} }
@ApiOperation(value = "刷新token")
@RequestMapping(value = "/refreshToken", method = RequestMethod.GET)
@ResponseBody
public CommonResult refreshToken(HttpServletRequest request) {
String token = request.getHeader(tokenHeader);
String refreshToken = memberService.refreshToken(token);
if (refreshToken == null) {
return CommonResult.failed("token已经过期");
}
Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", refreshToken);
tokenMap.put("tokenHead", tokenHead);
return CommonResult.success(tokenMap);
}
} }

View File

@@ -56,4 +56,9 @@ public interface UmsMemberService {
* 登录后获取token * 登录后获取token
*/ */
String login(String username, String password); String login(String username, String password);
/**
* 刷新token
*/
String refreshToken(String token);
} }

View File

@@ -177,6 +177,11 @@ public class UmsMemberServiceImpl implements UmsMemberService {
return token; return token;
} }
@Override
public String refreshToken(String token) {
return jwtTokenUtil.refreshHeadToken(token);
}
//对输入的验证码进行校验 //对输入的验证码进行校验
private boolean verifyAuthCode(String authCode, String telephone){ private boolean verifyAuthCode(String authCode, String telephone){
if(StringUtils.isEmpty(authCode)){ if(StringUtils.isEmpty(authCode)){

View File

@@ -54,7 +54,7 @@ jwt:
tokenHeader: Authorization #JWT存储的请求头 tokenHeader: Authorization #JWT存储的请求头
secret: mall-portal-secret #JWT加解密使用的密钥 secret: mall-portal-secret #JWT加解密使用的密钥
expiration: 604800 #JWT的超期限时间(60*60*24) expiration: 604800 #JWT的超期限时间(60*60*24)
tokenHead: Bearer #JWT负载中拿到开头 tokenHead: Bearer #JWT负载中拿到开头
ignored: #安全路径白名单 ignored: #安全路径白名单
urls: urls:
- /swagger-ui.html - /swagger-ui.html

View File

@@ -1,5 +1,7 @@
package com.macro.mall.security.util; package com.macro.mall.security.util;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;
@@ -120,25 +122,49 @@ public class JwtTokenUtil {
} }
/** /**
* 判断token是可以刷新 * 当原来的token没过期时是可以刷新
*/
private boolean canRefresh(String token) {
return !isTokenExpired(token);
}
/**
* 当原来的token没过期是可以刷新
* *
* @param oldToken 带tokenHead的token * @param oldToken 带tokenHead的token
*/ */
public String refreshHeadToken(String oldToken) { public String refreshHeadToken(String oldToken) {
if(StrUtil.isEmpty(oldToken)){
return null;
}
String token = oldToken.substring(tokenHead.length()); String token = oldToken.substring(tokenHead.length());
if (canRefresh(token)) { if(StrUtil.isEmpty(token)){
Claims claims = getClaimsFromToken(token); return null;
}
//token校验不通过
Claims claims = getClaimsFromToken(token);
if(claims==null){
return null;
}
//如果token已经过期不支持刷新
if(isTokenExpired(token)){
return null;
}
//如果token在30分钟之内刚刷新过返回原token
if(tokenRefreshJustBefore(token,30*60)){
return token;
}else{
claims.put(CLAIM_KEY_CREATED, new Date()); claims.put(CLAIM_KEY_CREATED, new Date());
return generateToken(claims); return generateToken(claims);
} }
return null; }
/**
* 判断token在指定时间内是否刚刚刷新过
* @param token 原token
* @param time 指定时间(秒)
*/
private boolean tokenRefreshJustBefore(String token, int time) {
Claims claims = getClaimsFromToken(token);
Date created = claims.get(CLAIM_KEY_CREATED, Date.class);
Date refreshDate = new Date();
//刷新时间在创建时间的指定时间内
if(refreshDate.after(created)&&refreshDate.before(DateUtil.offsetSecond(created,time))){
return true;
}
return false;
} }
} }