-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathRefreshTokenProvider.java
More file actions
100 lines (88 loc) · 3.23 KB
/
RefreshTokenProvider.java
File metadata and controls
100 lines (88 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package clap.server.adapter.outbound.jwt.refresh;
import clap.server.adapter.outbound.jwt.JwtClaims;
import clap.server.application.port.outbound.auth.JwtProvider;
import clap.server.common.annotation.jwt.RefreshTokenStrategy;
import clap.server.common.utils.DateUtil;
import clap.server.exception.JwtException;
import clap.server.exception.code.AuthErrorCode;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.Date;
import java.util.Map;
@Slf4j
@Component
@RefreshTokenStrategy
public class RefreshTokenProvider implements JwtProvider {
private final SecretKey secretKey;
private final Long tokenExpiration;
public RefreshTokenProvider(
@Value("${jwt.secret-key.refresh-token}") String jwtSecretKey,
@Value("${jwt.expiration-time.refresh-token}") Long tokenExpiration
) {
final byte[] secretKeyBytes = Base64.getDecoder().decode(jwtSecretKey);
this.secretKey = Keys.hmacShaKeyFor(secretKeyBytes);
this.tokenExpiration = tokenExpiration;
}
@Override
public String createToken(JwtClaims claims) {
Date now = new Date();
return Jwts.builder()
.setHeader(createHeader())
.setClaims(claims.getClaims())
.signWith(secretKey)
.setExpiration(createExpireDate(now, tokenExpiration))
.compact();
}
@Override
public JwtClaims parseJwtClaimsFromToken(String token) {
Claims claims = getClaimsFromToken(token);
return RefreshTokenClaim.of(
Long.parseLong(claims.get(RefreshTokenClaimKeys.USER_ID.getValue()).toString())
);
}
@Override
public LocalDateTime getExpiredDate(String token) {
Claims claims = getClaimsFromToken(token);
return DateUtil.toLocalDateTime(claims.getExpiration());
}
@Override
public boolean isTokenExpired(String token) {
try {
Claims claims = getClaimsFromToken(token);
return claims.getExpiration().before(new Date());
} catch (Exception e) {
log.error("Token is expired: {}", e.getMessage());
throw new JwtException(AuthErrorCode.EXPIRED_TOKEN);
}
}
@Override
public Claims getClaimsFromToken(String token) {
try {
return Jwts.parserBuilder()
.setSigningKey(secretKey)
.build()
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
log.error("Token parsing error: {}", e.getMessage());
throw new JwtException(AuthErrorCode.INVALID_TOKEN);
}
}
private Map<String, Object> createHeader() {
return Map.of(
"typ", "JWT",
"alg", "HS256",
"regDate", System.currentTimeMillis()
);
}
private Date createExpireDate(final Date now, long expirationTime) {
return new Date(now.getTime() + expirationTime);
}
}