刷新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")
@RequestMapping(value = "/token/refresh", method = RequestMethod.GET)
@RequestMapping(value = "/refreshToken", method = RequestMethod.GET)
@ResponseBody
public CommonResult refreshToken(HttpServletRequest request) {
String token = request.getHeader(tokenHeader);
String refreshToken = adminService.refreshToken(token);
if (refreshToken == null) {
return CommonResult.failed();
return CommonResult.failed("token已经过期");
}
Map<String, String> tokenMap = new HashMap<>();
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.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@@ -23,6 +24,8 @@ import java.util.Map;
@Api(tags = "UmsMemberController", description = "会员登录注册管理")
@RequestMapping("/sso")
public class UmsMemberController {
@Value("${jwt.tokenHeader}")
private String tokenHeader;
@Value("${jwt.tokenHead}")
private String tokenHead;
@Autowired
@@ -68,4 +71,19 @@ public class UmsMemberController {
@RequestParam String 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
*/
String login(String username, String password);
/**
* 刷新token
*/
String refreshToken(String token);
}

View File

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

View File

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

View File

@@ -1,5 +1,7 @@
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.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
@@ -120,25 +122,49 @@ public class JwtTokenUtil {
}
/**
* 判断token是可以刷新
*/
private boolean canRefresh(String token) {
return !isTokenExpired(token);
}
/**
* 当原来的token没过期是可以刷新
* 当原来的token没过期时是可以刷新
*
* @param oldToken 带tokenHead的token
*/
public String refreshHeadToken(String oldToken) {
if(StrUtil.isEmpty(oldToken)){
return null;
}
String token = oldToken.substring(tokenHead.length());
if (canRefresh(token)) {
Claims claims = getClaimsFromToken(token);
if(StrUtil.isEmpty(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());
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;
}
}