Repository navigation
Expand file tree
/
Copy pathAuthTokenProvider.java
More file actions
112 lines (96 loc) · 4.64 KB
/
Copy pathAuthTokenProvider.java
File metadata and controls
112 lines (96 loc) · 4.64 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
101
102
103
104
105
106
107
108
109
110
111
112
package com.example.solidconnection.auth.service;
import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND;
import com.example.solidconnection.auth.domain.AccessToken;
import com.example.solidconnection.auth.domain.AdminRefreshToken;
import com.example.solidconnection.auth.domain.RefreshToken;
import com.example.solidconnection.auth.domain.Subject;
import com.example.solidconnection.auth.token.config.TokenProperties;
import com.example.solidconnection.common.exception.CustomException;
import com.example.solidconnection.siteuser.domain.Role;
import com.example.solidconnection.siteuser.domain.SiteUser;
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class AuthTokenProvider {
private static final String ROLE_CLAIM_KEY = "role";
private static final String HOME_UNIVERSITY_CLAIM_KEY = "home_university";
private final TokenProvider tokenProvider;
private final TokenStorage tokenStorage;
private final SiteUserRepository siteUserRepository;
private final TokenProperties tokenProperties;
public AccessToken generateAccessToken(SiteUser siteUser) {
Subject subject = toSubject(siteUser);
Role role = siteUser.getRole();
Map<String, String> claims = new HashMap<>(Map.of(ROLE_CLAIM_KEY, role.name()));
if (siteUser.getHomeUniversityId() != null) {
claims.put(HOME_UNIVERSITY_CLAIM_KEY, String.valueOf(siteUser.getHomeUniversityId()));
}
String token = tokenProvider.generateToken(
subject,
claims,
tokenProperties.access().expireTime()
);
return new AccessToken(token);
}
public RefreshToken generateAndSaveRefreshToken(SiteUser siteUser) {
Subject subject = toSubject(siteUser);
String token = tokenProvider.generateToken(
subject,
tokenProperties.refresh().expireTime()
);
RefreshToken refreshToken = new RefreshToken(token);
return tokenStorage.saveToken(subject, refreshToken);
}
public AdminRefreshToken generateAndSaveAdminRefreshToken(SiteUser siteUser) {
Subject subject = toSubject(siteUser);
String token = tokenProvider.generateToken(
subject,
tokenProperties.adminRefresh().expireTime()
);
AdminRefreshToken adminRefreshToken = new AdminRefreshToken(token);
return tokenStorage.saveToken(subject, adminRefreshToken);
}
/*
* 유효한 리프레시 토큰인지 확인한다.
* - 요청된 토큰과 같은 subject 의 리프레시 토큰을 조회한다.
* - 조회된 리프레시 토큰과 요청된 토큰이 같은지 비교한다.
* */
public boolean isValidRefreshToken(String requestedRefreshToken) {
Subject subject = tokenProvider.parseSubject(requestedRefreshToken);
return tokenStorage.findToken(subject, RefreshToken.class)
.map(foundRefreshToken -> Objects.equals(foundRefreshToken, requestedRefreshToken))
.orElse(false);
}
public boolean isValidAdminRefreshToken(String requestedAdminRefreshToken) {
Subject subject = tokenProvider.parseSubject(requestedAdminRefreshToken);
return tokenStorage.findToken(subject, AdminRefreshToken.class)
.map(foundToken -> Objects.equals(foundToken, requestedAdminRefreshToken))
.orElse(false);
}
public void deleteRefreshTokenByAccessToken(String accessToken) {
Subject subject = tokenProvider.parseSubject(accessToken);
tokenStorage.deleteToken(subject, RefreshToken.class);
}
public void deleteAdminRefreshTokenByAccessToken(String accessToken) {
Subject subject = tokenProvider.parseSubject(accessToken);
tokenStorage.deleteToken(subject, AdminRefreshToken.class);
}
public SiteUser parseSiteUser(String token) {
Subject subject = tokenProvider.parseSubject(token);
long siteUserId = Long.parseLong(subject.value());
return siteUserRepository.findById(siteUserId)
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
}
public Long parseHomeUniversityId(String token) {
String value = tokenProvider.parseClaims(token, HOME_UNIVERSITY_CLAIM_KEY, String.class);
return value != null ? Long.parseLong(value) : null;
}
public Subject toSubject(SiteUser siteUser) {
return new Subject(siteUser.getId().toString());
}
}