You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
3.3 KiB

package com.aurora.service.impl;
import com.aurora.model.dto.UserDetailsDTO;
import com.aurora.service.RedisService;
import com.aurora.service.TokenService;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.Optional;
import java.util.UUID;
import static com.aurora.constant.AuthConstant.*;
import static com.aurora.constant.RedisConstant.LOGIN_USER;
@Service
public class TokenServiceImpl implements TokenService {
@Value("${jwt.secret}")
private String secret;
@Autowired
private RedisService redisService;
@Override
public String createToken(UserDetailsDTO userDetailsDTO) {
refreshToken(userDetailsDTO);
String userId = userDetailsDTO.getId().toString();
return createToken(userId);
}
@Override
public String createToken(String subject) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
SecretKey secretKey = generalKey();
return Jwts.builder().setId(getUuid()).setSubject(subject)
.setIssuer("huaweimian")
.signWith(signatureAlgorithm, secretKey).compact();
}
@Override
public void refreshToken(UserDetailsDTO userDetailsDTO) {
LocalDateTime currentTime = LocalDateTime.now();
userDetailsDTO.setExpireTime(currentTime.plusSeconds(EXPIRE_TIME));
String userId = userDetailsDTO.getId().toString();
redisService.hSet(LOGIN_USER, userId, userDetailsDTO, EXPIRE_TIME);
}
@Override
public void renewToken(UserDetailsDTO userDetailsDTO) {
LocalDateTime expireTime = userDetailsDTO.getExpireTime();
LocalDateTime currentTime = LocalDateTime.now();
if (Duration.between(currentTime, expireTime).toMinutes() <= TWENTY_MINUTES) {
refreshToken(userDetailsDTO);
}
}
@Override
public Claims parseToken(String token) {
SecretKey secretKey = generalKey();
return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
}
@Override
public UserDetailsDTO getUserDetailDTO(HttpServletRequest request) {
String token = Optional.ofNullable(request.getHeader(TOKEN_HEADER)).orElse("").replaceFirst(TOKEN_PREFIX, "");
if (StringUtils.hasText(token) && !token.equals("null")) {
Claims claims = parseToken(token);
String userId = claims.getSubject();
return (UserDetailsDTO) redisService.hGet(LOGIN_USER, userId);
}
return null;
}
@Override
public void delLoginUser(Integer userId) {
redisService.hDel(LOGIN_USER, String.valueOf(userId));
}
public String getUuid() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
public SecretKey generalKey() {
byte[] encodedKey = Base64.getDecoder().decode(secret);
return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
}
}