|
@@ -1,14 +1,17 @@
|
|
|
package cn.iocoder.yudao.module.system.service.oauth2;
|
|
package cn.iocoder.yudao.module.system.service.oauth2;
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
+import cn.hutool.core.date.LocalDateTimeUtil;
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
|
|
+import cn.hutool.core.util.ObjUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
|
import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
|
|
import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
|
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
|
|
|
|
+import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
|
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
|
@@ -28,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
|
|
+import java.time.temporal.ChronoUnit;
|
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
@@ -159,10 +163,35 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
public void renewTokenExpireTime(String accessToken) {
|
|
public void renewTokenExpireTime(String accessToken) {
|
|
|
OAuth2AccessTokenDO accessTokenDO = getAccessToken(accessToken);
|
|
OAuth2AccessTokenDO accessTokenDO = getAccessToken(accessToken);
|
|
|
- String refreshToken = accessTokenDO.getRefreshToken();
|
|
|
|
|
- oauth2AccessTokenRedisDAO.renewToken(accessToken, refreshToken);
|
|
|
|
|
|
|
+ if (accessTokenDO == null) {
|
|
|
|
|
+ throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (DateUtils.isExpired(accessTokenDO.getExpiresTime())) {
|
|
|
|
|
+ throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌已过期");
|
|
|
|
|
+ }
|
|
|
|
|
+ LocalDateTime currentExpiresTime = accessTokenDO.getExpiresTime();
|
|
|
|
|
+ if (ObjUtil.isEmpty(currentExpiresTime)) {
|
|
|
|
|
+ throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "访问令牌过期时间异常");
|
|
|
|
|
+ }
|
|
|
|
|
+ LocalDateTime currentTime = LocalDateTime.now();
|
|
|
|
|
+ // 计算新的过期时间(例如延长30分钟) 以当前时间为基准计算新的过期时间
|
|
|
|
|
+ LocalDateTime newExpiresTime = currentTime.plusMinutes(30);
|
|
|
|
|
+ long newTtl = LocalDateTimeUtil.between(LocalDateTime.now(), newExpiresTime, ChronoUnit.SECONDS);
|
|
|
|
|
+ if (newTtl > 0) {
|
|
|
|
|
+ accessTokenDO.setExpiresTime(newExpiresTime);
|
|
|
|
|
+ // 只有当accessTokenDO有id时才更新MySQL(避免从refreshToken转换而来的token)
|
|
|
|
|
+ if (ObjUtil.isNotEmpty(accessTokenDO.getId())) {
|
|
|
|
|
+ oauth2AccessTokenMapper.updateById(accessTokenDO);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 更新Redis缓存
|
|
|
|
|
+ oauth2AccessTokenRedisDAO.set(accessTokenDO);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "续期失败,新的过期时间无效");
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) {
|
|
private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) {
|