Skip to content
Open
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 @@ -5,10 +5,11 @@
import com.example.solidconnection.auth.dto.EmailSignUpTokenResponse;
import com.example.solidconnection.auth.dto.ReissueResponse;
import com.example.solidconnection.auth.dto.SignInResponse;
import com.example.solidconnection.auth.dto.SignInResult;
import com.example.solidconnection.auth.dto.SignUpRequest;
import com.example.solidconnection.auth.dto.oauth.OAuthCodeRequest;
import com.example.solidconnection.auth.dto.oauth.OAuthResponse;
import com.example.solidconnection.auth.dto.oauth.OAuthSignInResponse;
import com.example.solidconnection.auth.dto.oauth.OAuthResult;
import com.example.solidconnection.auth.service.AuthService;
import com.example.solidconnection.auth.service.oauth.OAuthService;
import com.example.solidconnection.auth.service.signin.EmailSignInService;
Expand Down Expand Up @@ -47,33 +48,29 @@ public ResponseEntity<OAuthResponse> processAppleOAuth(
@Valid @RequestBody OAuthCodeRequest oAuthCodeRequest,
HttpServletResponse httpServletResponse
) {
OAuthResponse oAuthResponse = oAuthService.processOAuth(AuthType.APPLE, oAuthCodeRequest);
if (oAuthResponse instanceof OAuthSignInResponse signInResponse) {
refreshTokenCookieManager.setCookie(httpServletResponse, signInResponse.refreshToken());
}
return ResponseEntity.ok(oAuthResponse);
OAuthResult oAuthResult = oAuthService.processOAuth(AuthType.APPLE, oAuthCodeRequest);
setRefreshTokenCookie(httpServletResponse, oAuthResult.refreshToken());
return ResponseEntity.ok(oAuthResult.response());
}

@PostMapping("/kakao")
public ResponseEntity<OAuthResponse> processKakaoOAuth(
@Valid @RequestBody OAuthCodeRequest oAuthCodeRequest,
HttpServletResponse httpServletResponse
) {
OAuthResponse oAuthResponse = oAuthService.processOAuth(AuthType.KAKAO, oAuthCodeRequest);
if (oAuthResponse instanceof OAuthSignInResponse signInResponse) {
refreshTokenCookieManager.setCookie(httpServletResponse, signInResponse.refreshToken());
}
return ResponseEntity.ok(oAuthResponse);
OAuthResult oAuthResult = oAuthService.processOAuth(AuthType.KAKAO, oAuthCodeRequest);
setRefreshTokenCookie(httpServletResponse, oAuthResult.refreshToken());
return ResponseEntity.ok(oAuthResult.response());
}

@PostMapping("/email/sign-in")
public ResponseEntity<SignInResponse> signInWithEmail(
@Valid @RequestBody EmailSignInRequest signInRequest,
HttpServletResponse httpServletResponse
) {
SignInResponse signInResponse = emailSignInService.signIn(signInRequest);
refreshTokenCookieManager.setCookie(httpServletResponse, signInResponse.refreshToken());
return ResponseEntity.ok(signInResponse);
SignInResult signInResult = emailSignInService.signIn(signInRequest);
refreshTokenCookieManager.setCookie(httpServletResponse, signInResult.refreshToken());
return ResponseEntity.ok(SignInResponse.from(signInResult));
}

/* 이메일 회원가입 시 signUpToken 을 발급받기 위한 api */
Expand All @@ -87,10 +84,12 @@ public ResponseEntity<EmailSignUpTokenResponse> signUpWithEmail(

@PostMapping("/sign-up")
public ResponseEntity<SignInResponse> signUp(
@Valid @RequestBody SignUpRequest signUpRequest
@Valid @RequestBody SignUpRequest signUpRequest,
HttpServletResponse httpServletResponse
) {
SignInResponse signInResponse = signUpService.signUp(signUpRequest);
return ResponseEntity.ok(signInResponse);
SignInResult signInResult = signUpService.signUp(signUpRequest);
refreshTokenCookieManager.setCookie(httpServletResponse, signInResult.refreshToken());
return ResponseEntity.ok(SignInResponse.from(signInResult));
}

@PostMapping("/sign-out")
Expand Down Expand Up @@ -123,6 +122,12 @@ public ResponseEntity<ReissueResponse> reissueToken(HttpServletRequest request)
return ResponseEntity.ok(reissueResponse);
}

private void setRefreshTokenCookie(HttpServletResponse httpServletResponse, String refreshToken) {
if (refreshToken != null) {
refreshTokenCookieManager.setCookie(httpServletResponse, refreshToken);
}
}

private String getAccessToken(Authentication authentication) {
if (authentication == null || !(authentication.getCredentials() instanceof String accessToken)) {
throw new CustomException(ErrorCode.AUTHENTICATION_FAILED, "엑세스 토큰이 없습니다.");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package com.example.solidconnection.auth.dto;

import com.example.solidconnection.auth.domain.AccessToken;
import com.example.solidconnection.auth.domain.RefreshToken;

public record SignInResponse(
String accessToken,
String refreshToken
String accessToken
) {

public static SignInResponse of(AccessToken accessToken, RefreshToken refreshToken) {
return new SignInResponse(accessToken.token(), refreshToken.token());
public static SignInResponse from(SignInResult signInResult) {
return new SignInResponse(signInResult.accessToken());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.solidconnection.auth.dto;

import com.example.solidconnection.auth.domain.AccessToken;
import com.example.solidconnection.auth.domain.RefreshToken;

public record SignInResult(
String accessToken,
String refreshToken
) {

public static SignInResult of(AccessToken accessToken, RefreshToken refreshToken) {
return new SignInResult(accessToken.token(), refreshToken.token());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.solidconnection.auth.dto.oauth;

public record OAuthResult(
OAuthResponse response,
String refreshToken
) {

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.example.solidconnection.auth.dto.oauth;

import com.example.solidconnection.auth.dto.SignInResult;

public record OAuthSignInResponse(
boolean isRegistered,
String accessToken,
String refreshToken) implements OAuthResponse {
String accessToken) implements OAuthResponse {

public static OAuthSignInResponse from(SignInResult signInResult) {
return new OAuthSignInResponse(signInResult.accessToken());
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package com.example.solidconnection.auth.dto.oauth;

public record SignUpPrepareResponse(
boolean isRegistered,
String nickname,
String email,
String profileImageUrl,
String signUpToken) implements OAuthResponse {

public static SignUpPrepareResponse of(OAuthUserInfoDto oAuthUserInfoDto, String signUpToken) {
return new SignUpPrepareResponse(
false,
oAuthUserInfoDto.getNickname(),
oAuthUserInfoDto.getEmail(),
oAuthUserInfoDto.getProfileImageUrl(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.example.solidconnection.auth.service.oauth;

import com.example.solidconnection.auth.domain.SignUpToken;
import com.example.solidconnection.auth.dto.SignInResponse;
import com.example.solidconnection.auth.dto.SignInResult;
import com.example.solidconnection.auth.dto.oauth.OAuthCodeRequest;
import com.example.solidconnection.auth.dto.oauth.OAuthResponse;
import com.example.solidconnection.auth.dto.oauth.OAuthResult;
import com.example.solidconnection.auth.dto.oauth.OAuthSignInResponse;
import com.example.solidconnection.auth.dto.oauth.OAuthUserInfoDto;
import com.example.solidconnection.auth.dto.oauth.SignUpPrepareResponse;
Expand Down Expand Up @@ -32,26 +32,26 @@ public class OAuthService {
private final OAuthClientMap oauthClientMap;

@Transactional
public OAuthResponse processOAuth(AuthType authType, OAuthCodeRequest codeRequest) {
public OAuthResult processOAuth(AuthType authType, OAuthCodeRequest codeRequest) {
OAuthClient oauthClient = oauthClientMap.getOAuthClient(authType);
OAuthUserInfoDto userInfo = oauthClient.getUserInfo(codeRequest.code());
Optional<SiteUser> optionalSiteUser = siteUserRepository.findByEmailAndAuthType(userInfo.getEmail(), authType);

if (optionalSiteUser.isPresent()) {
SiteUser siteUser = optionalSiteUser.get();
return getSignInResponse(siteUser);
return getSignInResult(siteUser);
}

return getSignUpPrepareResponse(userInfo, authType);
return getSignUpPrepareResult(userInfo, authType);
}

private OAuthSignInResponse getSignInResponse(SiteUser siteUser) {
SignInResponse signInResponse = signInService.signIn(siteUser);
return new OAuthSignInResponse(true, signInResponse.accessToken(), signInResponse.refreshToken());
private OAuthResult getSignInResult(SiteUser siteUser) {
SignInResult signInResult = signInService.signIn(siteUser);
return new OAuthResult(OAuthSignInResponse.from(signInResult), signInResult.refreshToken());
}

private SignUpPrepareResponse getSignUpPrepareResponse(OAuthUserInfoDto userInfoDto, AuthType authType) {
private OAuthResult getSignUpPrepareResult(OAuthUserInfoDto userInfoDto, AuthType authType) {
SignUpToken signUpToken = signUpTokenProvider.generateAndSaveSignUpToken(userInfoDto.getEmail(), authType);
return SignUpPrepareResponse.of(userInfoDto, signUpToken.token());
return new OAuthResult(SignUpPrepareResponse.of(userInfoDto, signUpToken.token()), null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import static com.example.solidconnection.common.exception.ErrorCode.SIGN_IN_FAILED;

import com.example.solidconnection.auth.dto.EmailSignInRequest;
import com.example.solidconnection.auth.dto.SignInResponse;
import com.example.solidconnection.auth.dto.SignInResult;
import com.example.solidconnection.common.exception.CustomException;
import com.example.solidconnection.siteuser.domain.AuthType;
import com.example.solidconnection.siteuser.domain.SiteUser;
Expand All @@ -22,7 +22,7 @@ public class EmailSignInService {
private final PasswordEncoder passwordEncoder;

@Transactional(readOnly = true)
public SignInResponse signIn(EmailSignInRequest signInRequest) {
public SignInResult signIn(EmailSignInRequest signInRequest) {
SiteUser siteUser = getEmailMatchingUserOrThrow(signInRequest.email());
validatePassword(signInRequest.password(), siteUser.getPassword());
return signInService.signIn(siteUser);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.example.solidconnection.auth.domain.AccessToken;
import com.example.solidconnection.auth.domain.RefreshToken;
import com.example.solidconnection.auth.dto.SignInResponse;
import com.example.solidconnection.auth.dto.SignInResult;
import com.example.solidconnection.auth.service.AuthTokenProvider;
import com.example.solidconnection.siteuser.domain.SiteUser;
import lombok.RequiredArgsConstructor;
Expand All @@ -16,11 +16,11 @@ public class SignInService {
private final AuthTokenProvider authTokenProvider;

@Transactional
public SignInResponse signIn(SiteUser siteUser) {
public SignInResult signIn(SiteUser siteUser) {
resetQuitedAt(siteUser);
AccessToken accessToken = authTokenProvider.generateAccessToken(siteUser);
RefreshToken refreshToken = authTokenProvider.generateAndSaveRefreshToken(siteUser);
return SignInResponse.of(accessToken, refreshToken);
return SignInResult.of(accessToken, refreshToken);
}

private void resetQuitedAt(SiteUser siteUser) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import static com.example.solidconnection.common.exception.ErrorCode.SIGN_UP_TOKEN_INVALID;
import static com.example.solidconnection.common.exception.ErrorCode.USER_ALREADY_EXISTED;

import com.example.solidconnection.auth.dto.SignInResponse;
import com.example.solidconnection.auth.dto.SignInResult;
import com.example.solidconnection.auth.dto.SignUpRequest;
import com.example.solidconnection.auth.service.signin.SignInService;
import com.example.solidconnection.common.exception.CustomException;
Expand Down Expand Up @@ -38,7 +38,7 @@ public class SignUpService {
private final PasswordTemporaryStorage passwordTemporaryStorage;

@Transactional
public SignInResponse signUp(SignUpRequest signUpRequest) {
public SignInResult signUp(SignUpRequest signUpRequest) {
// 검증
signUpTokenProvider.validateSignUpToken(signUpRequest.signUpToken());
String email = signUpTokenProvider.parseEmail(signUpRequest.signUpToken());
Expand Down Expand Up @@ -66,7 +66,7 @@ public SignInResponse signUp(SignUpRequest signUpRequest) {
interestedCountryService.saveInterestedCountry(siteUser, signUpRequest.interestedCountries());

// 로그인
SignInResponse response = signInService.signIn(siteUser);
SignInResult response = signInService.signIn(siteUser);

// 회원가입을 위해 저장한 데이터(SignUpToken, 비밀번호) 삭제
clearSignUpData(email, authType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import com.example.solidconnection.auth.dto.oauth.OAuthCodeRequest;
import com.example.solidconnection.auth.dto.oauth.OAuthResponse;
import com.example.solidconnection.auth.dto.oauth.OAuthResult;
import com.example.solidconnection.auth.dto.oauth.OAuthSignInResponse;
import com.example.solidconnection.auth.dto.oauth.OAuthUserInfoDto;
import com.example.solidconnection.auth.dto.oauth.SignUpPrepareResponse;
Expand Down Expand Up @@ -57,32 +58,33 @@ void setUp() { // 실제 client 호출하지 않도록 mocking
siteUserFixture.사용자(email, authType);

// when
OAuthResponse response = oAuthService.processOAuth(authType, new OAuthCodeRequest(oauthCode));
OAuthResult oAuthResult = oAuthService.processOAuth(authType, new OAuthCodeRequest(oauthCode));

// then
OAuthResponse response = oAuthResult.response();
assertThat(response).isInstanceOf(OAuthSignInResponse.class);
OAuthSignInResponse signInResponse = (OAuthSignInResponse) response;
assertAll(
() -> assertThat(signInResponse.isRegistered()).isTrue(),
() -> assertThat(signInResponse.accessToken()).isNotBlank(),
() -> assertThat(signInResponse.refreshToken()).isNotBlank()
() -> assertThat(oAuthResult.refreshToken()).isNotBlank()
);
}

@Test
void 신규_회원이라면_회원가입에_필요한_정보를_응답한다() {
// when
OAuthResponse response = oAuthService.processOAuth(authType, new OAuthCodeRequest(oauthCode));
OAuthResult oAuthResult = oAuthService.processOAuth(authType, new OAuthCodeRequest(oauthCode));

// then
OAuthResponse response = oAuthResult.response();
assertThat(response).isInstanceOf(SignUpPrepareResponse.class);
SignUpPrepareResponse signUpPrepareResponse = (SignUpPrepareResponse) response;
assertAll(
() -> assertThat(signUpPrepareResponse.isRegistered()).isFalse(),
() -> assertThat(signUpPrepareResponse.signUpToken()).isNotBlank(),
() -> assertThat(signUpPrepareResponse.email()).isEqualTo(email),
() -> assertThat(signUpPrepareResponse.profileImageUrl()).isEqualTo(profileImageUrl),
() -> assertThat(signUpPrepareResponse.nickname()).isEqualTo(nickname)
() -> assertThat(signUpPrepareResponse.nickname()).isEqualTo(nickname),
() -> assertThat(oAuthResult.refreshToken()).isNull()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import static org.junit.jupiter.api.Assertions.assertAll;

import com.example.solidconnection.auth.dto.EmailSignInRequest;
import com.example.solidconnection.auth.dto.SignInResponse;
import com.example.solidconnection.auth.dto.SignInResult;
import com.example.solidconnection.common.exception.CustomException;
import com.example.solidconnection.common.exception.ErrorCode;
import com.example.solidconnection.siteuser.domain.SiteUser;
Expand Down Expand Up @@ -35,12 +35,12 @@ class EmailSignInServiceTest {
EmailSignInRequest signInRequest = new EmailSignInRequest(user.getEmail(), rawPassword);

// when
SignInResponse signInResponse = emailSignInService.signIn(signInRequest);
SignInResult signInResult = emailSignInService.signIn(signInRequest);

// then
assertAll(
() -> Assertions.assertThat(signInResponse.accessToken()).isNotNull(),
() -> Assertions.assertThat(signInResponse.refreshToken()).isNotNull()
() -> Assertions.assertThat(signInResult.accessToken()).isNotNull(),
() -> Assertions.assertThat(signInResult.refreshToken()).isNotNull()
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import com.example.solidconnection.auth.domain.RefreshToken;
import com.example.solidconnection.auth.domain.Subject;
import com.example.solidconnection.auth.dto.SignInResponse;
import com.example.solidconnection.auth.dto.SignInResult;
import com.example.solidconnection.auth.service.TokenProvider;
import com.example.solidconnection.auth.service.TokenStorage;
import com.example.solidconnection.siteuser.domain.SiteUser;
Expand Down Expand Up @@ -46,16 +46,16 @@ void setUp() {
@Test
void 성공적으로_로그인한다() {
// when
SignInResponse signInResponse = signInService.signIn(user);
SignInResult signInResult = signInService.signIn(user);

// then
Subject accessTokenSubject = tokenProvider.parseSubject(signInResponse.accessToken());
Subject refreshTokenSubject = tokenProvider.parseSubject(signInResponse.refreshToken());
Subject accessTokenSubject = tokenProvider.parseSubject(signInResult.accessToken());
Subject refreshTokenSubject = tokenProvider.parseSubject(signInResult.refreshToken());
Optional<String> savedRefreshToken = tokenStorage.findToken(subject, RefreshToken.class);
assertAll(
() -> assertThat(accessTokenSubject).isEqualTo(subject),
() -> assertThat(refreshTokenSubject).isEqualTo(subject),
() -> assertThat(savedRefreshToken).hasValue(signInResponse.refreshToken()));
() -> assertThat(savedRefreshToken).hasValue(signInResult.refreshToken()));
}

@Test
Expand Down
Loading