diff --git a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java index ef188833b..0f5e46c23 100644 --- a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java @@ -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; @@ -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; @@ -29,9 +31,14 @@ public class AuthTokenProvider { public AccessToken generateAccessToken(SiteUser siteUser) { Subject subject = toSubject(siteUser); Role role = siteUser.getRole(); + Map 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); @@ -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()); } diff --git a/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java index 7a6f64428..6b2d36a11 100644 --- a/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java @@ -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; @@ -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()); } @@ -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 리프레시_토큰을_제공한다 { diff --git a/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java b/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java index 05262b6a2..1753d0d5d 100644 --- a/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java +++ b/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java @@ -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")