Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
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;
Expand All @@ -20,6 +21,7 @@
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;
Expand All @@ -29,9 +31,14 @@ public class AuthTokenProvider {
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,
Map.of(ROLE_CLAIM_KEY, role.name()),
claims,
tokenProperties.access().expireTime()
);
return new AccessToken(token);
Expand Down Expand Up @@ -71,6 +78,11 @@ public SiteUser parseSiteUser(String token) {
.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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.example.solidconnection.siteuser.domain.SiteUser;
import com.example.solidconnection.siteuser.fixture.SiteUserFixture;
import com.example.solidconnection.support.TestContainerSpringBootTest;
import com.example.solidconnection.university.fixture.HomeUniversityFixture;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
Expand All @@ -33,12 +34,19 @@ class AuthTokenProviderTest {
@Autowired
private SiteUserFixture siteUserFixture;

@Autowired
private HomeUniversityFixture homeUniversityFixture;

private SiteUser siteUser;
private SiteUser siteUserWithHomeUniversity;
private Long homeUniversityId;
private Subject expectedSubject;

@BeforeEach
void setUp() {
homeUniversityId = homeUniversityFixture.인하대학교().getId();
siteUser = siteUserFixture.사용자();
siteUserWithHomeUniversity = siteUserFixture.국내_대학_정보_소지_사용자(homeUniversityId);
expectedSubject = new Subject(siteUser.getId().toString());
}

Expand Down Expand Up @@ -70,6 +78,30 @@ void setUp() {
assertThat(actualSitUser.getId()).isEqualTo(siteUser.getId());
}

@Nested
class 액세스_토큰_homeUniversityId_클레임 {

@Test
void homeUniversityId가_있는_사용자는_액세스_토큰_클레임에_포함된다() {
// when
String token = authTokenProvider.generateAccessToken(siteUserWithHomeUniversity).token();

// then
Long actual = authTokenProvider.parseHomeUniversityId(token);
assertThat(actual).isEqualTo(homeUniversityId);
}

@Test
void homeUniversityId가_없는_사용자는_액세스_토큰_클레임에서_생략된다() {
// when
String token = authTokenProvider.generateAccessToken(siteUser).token();

// then
Long actual = authTokenProvider.parseHomeUniversityId(token);
assertThat(actual).isNull();
}
}

@Nested
class 리프레시_토큰을_제공한다 {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,19 @@ public class SiteUserFixture {
.create();
}

public SiteUser 국내_대학_정보_소지_사용자(Long homeUniversityId) {
return siteUserFixtureBuilder.siteUser()
.email("university@example.com")
.authType(AuthType.EMAIL)
.nickname("국내대학사용자")
.homeUniversityId(homeUniversityId)
.profileImageUrl("profileImageUrl")
.role(Role.MENTEE)
.password("password123")
.userStatus(UserStatus.ACTIVE)
.create();
}

public SiteUser 멘토(int index, String nickname) {
return siteUserFixtureBuilder.siteUser()
.email("mentor" + index + "@example.com")
Expand Down
Loading