-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* [ARV-154] fix: oauth2 전면 재구현 * [ARV-154] refactor: ApiTestSupport controller 변경 * [ARV-154] fix: GUEST role 삭제 및 GUEST 로그인 삭제 * [ARV-154] fix: 회원가입 GUEST 대신 ANONYMOUS 접근 가능하도록 수정 * [ARV-154] fix: jwt 토큰 검증 로직 개선 - refresh token 만료 시 access token 상관 없이 예외 발생 * [ARV-154] fix: refreshToken 쿠키 이름 스펠링 변경 * [ARV-154] refactor: 추가 및 수정 메서드 매개변수 final화 * [ARV-154] feat: 토큰 재발급 API 추가 - 카카오 로그인 검증 시 user가 아니라면 cookie 등록 안되게 수정 * [ARV-154] fix: redirect url API 제거 및 환경변수 authorization-uri 삭제 * [ARV-154] refactor: cookie 도메인 이름 환경변수화 * [ARV-154] fix: @AuthMember import 패키지 변경 * [ARV-154] refactor: kakao oauuth2 dto record화 * [ARV-154] refactor: AuthService kakaoLogin()에서 else문 제거
- Loading branch information
Showing
66 changed files
with
645 additions
and
613 deletions.
There are no files selected for viewing
107 changes: 107 additions & 0 deletions
107
src/main/java/com/backend/allreva/auth/application/AuthService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
package com.backend.allreva.auth.application; | ||
|
||
import com.backend.allreva.auth.application.dto.LoginResponse; | ||
import com.backend.allreva.auth.application.dto.ReissueRequest; | ||
import com.backend.allreva.auth.application.dto.ReissueResponse; | ||
import com.backend.allreva.auth.application.dto.UserInfo; | ||
import com.backend.allreva.auth.exception.code.InvalidJwtTokenException; | ||
import com.backend.allreva.auth.exception.code.TokenNotFoundException; | ||
import com.backend.allreva.common.model.Email; | ||
import com.backend.allreva.member.command.domain.Member; | ||
import com.backend.allreva.member.command.domain.MemberRepository; | ||
import com.backend.allreva.member.command.domain.value.LoginProvider; | ||
import java.util.Optional; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
@Service | ||
@Transactional | ||
@RequiredArgsConstructor | ||
public class AuthService { | ||
|
||
private final OAuth2LoginService oAuth2LoginService; | ||
private final JwtService jwtService; | ||
private final MemberRepository memberRepository; | ||
|
||
/** | ||
* 카카오 로그인을 검증합니다. | ||
* @param authorizationCode 인가 코드 | ||
* @return 로그인 응답 | ||
*/ | ||
public LoginResponse kakaoLogin(final String authorizationCode) { | ||
UserInfo userInfo = oAuth2LoginService.getUserInfo(authorizationCode); | ||
|
||
// 회원 존재 확인 | ||
Email emailVO = Email.builder() | ||
.email(userInfo.email()) | ||
.build(); | ||
LoginProvider loginProvider = userInfo.loginProvider(); | ||
Optional<Member> memberOptional = memberRepository.findByEmailAndLoginProvider(emailVO, loginProvider); | ||
|
||
if (memberOptional.isPresent()) { | ||
return getMemberInfo(memberOptional.get()); | ||
} | ||
return getTemporaryMemberInfo(userInfo); | ||
|
||
} | ||
|
||
private LoginResponse getTemporaryMemberInfo(final UserInfo userInfo) { | ||
return LoginResponse.builder() | ||
.isUser(false) | ||
.email(userInfo.email()) | ||
.nickname(userInfo.nickname()) | ||
.profileImageUrl(userInfo.profileImageUrl()) | ||
.build(); | ||
} | ||
|
||
private LoginResponse getMemberInfo(final Member member) { | ||
// token 생성 | ||
Long memberId = member.getId(); | ||
String accessToken = jwtService.generateAccessToken(String.valueOf(memberId)); | ||
String refreshToken = jwtService.generateRefreshToken(String.valueOf(memberId)); | ||
|
||
// redis에 RefreshToken 저장 | ||
jwtService.updateRefreshToken(refreshToken, memberId); | ||
|
||
return LoginResponse.builder() | ||
.isUser(true) | ||
.accessToken(accessToken) | ||
.refreshToken(refreshToken) | ||
.email(member.getEmail().getEmail()) | ||
.nickname(member.getMemberInfo().getNickname()) | ||
.profileImageUrl(member.getMemberInfo().getProfileImageUrl()) | ||
.build(); | ||
} | ||
|
||
/** | ||
* Access Token을 재발급합니다. | ||
* @param reissueRequest Refresh Token | ||
* @Return 재발급된 Access Token 및 Refresh Token | ||
*/ | ||
public ReissueResponse reissueAccessToken(final ReissueRequest reissueRequest) { | ||
String refreshToken = reissueRequest.refreshToken(); | ||
|
||
// refresh token 검증 | ||
boolean isRefreshTokenValid = jwtService.validateToken(refreshToken); | ||
if (!isRefreshTokenValid) { | ||
throw new InvalidJwtTokenException(); | ||
} | ||
if (!jwtService.isRefreshTokenExist(refreshToken)) { | ||
throw new TokenNotFoundException(); | ||
} | ||
|
||
// access token 재발급 | ||
String memberId = jwtService.extractMemberId(refreshToken); | ||
String generatedAccessToken = jwtService.generateAccessToken(memberId); | ||
|
||
// token rotate | ||
String generateRefreshToken = jwtService.generateRefreshToken(memberId); | ||
jwtService.updateRefreshToken(generateRefreshToken, Long.valueOf(memberId)); | ||
|
||
return ReissueResponse.builder() | ||
.accessToken(generatedAccessToken) | ||
.refreshToken(generateRefreshToken) | ||
.build(); | ||
} | ||
} |
28 changes: 28 additions & 0 deletions
28
src/main/java/com/backend/allreva/auth/application/CookieService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package com.backend.allreva.auth.application; | ||
|
||
import com.backend.allreva.common.util.CookieUtils; | ||
import jakarta.servlet.http.HttpServletResponse; | ||
import org.springframework.beans.factory.annotation.Value; | ||
import org.springframework.stereotype.Service; | ||
|
||
@Service | ||
public class CookieService { | ||
|
||
@Value("${jwt.refresh.expiration}") | ||
private int refreshTime; | ||
@Value("${url.name}") | ||
private String domainName; | ||
|
||
public void addRefreshTokenCookie( | ||
final HttpServletResponse response, | ||
final String refreshToken | ||
) { | ||
CookieUtils.addCookie( | ||
response, | ||
domainName, | ||
"refreshToken", | ||
refreshToken, | ||
refreshTime | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8 changes: 8 additions & 0 deletions
8
src/main/java/com/backend/allreva/auth/application/OAuth2LoginService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package com.backend.allreva.auth.application; | ||
|
||
import com.backend.allreva.auth.application.dto.UserInfo; | ||
|
||
public interface OAuth2LoginService { | ||
|
||
UserInfo getUserInfo(String authorizationCode); | ||
} |
15 changes: 15 additions & 0 deletions
15
src/main/java/com/backend/allreva/auth/application/dto/LoginResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package com.backend.allreva.auth.application.dto; | ||
|
||
import lombok.Builder; | ||
|
||
@Builder | ||
public record LoginResponse( | ||
boolean isUser, | ||
String email, | ||
String nickname, | ||
String profileImageUrl, | ||
String accessToken, | ||
String refreshToken | ||
) { | ||
|
||
} |
30 changes: 0 additions & 30 deletions
30
src/main/java/com/backend/allreva/auth/application/dto/LoginSuccessResponse.java
This file was deleted.
Oops, something went wrong.
10 changes: 10 additions & 0 deletions
10
src/main/java/com/backend/allreva/auth/application/dto/ReissueRequest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package com.backend.allreva.auth.application.dto; | ||
|
||
import lombok.Builder; | ||
|
||
@Builder | ||
public record ReissueRequest( | ||
String refreshToken | ||
) { | ||
|
||
} |
11 changes: 11 additions & 0 deletions
11
src/main/java/com/backend/allreva/auth/application/dto/ReissueResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.backend.allreva.auth.application.dto; | ||
|
||
import lombok.Builder; | ||
|
||
@Builder | ||
public record ReissueResponse( | ||
String accessToken, | ||
String refreshToken | ||
) { | ||
|
||
} |
15 changes: 15 additions & 0 deletions
15
src/main/java/com/backend/allreva/auth/application/dto/UserInfo.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package com.backend.allreva.auth.application.dto; | ||
|
||
import com.backend.allreva.member.command.domain.value.LoginProvider; | ||
import lombok.Builder; | ||
|
||
@Builder | ||
public record UserInfo( | ||
LoginProvider loginProvider, | ||
String providerId, | ||
String nickname, | ||
String email, | ||
String profileImageUrl | ||
) { | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
...ception/UnsupportedProviderException.java → ...on/code/UnsupportedProviderException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
19 changes: 19 additions & 0 deletions
19
src/main/java/com/backend/allreva/auth/oauth2/KakaoAuthClient.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package com.backend.allreva.auth.oauth2; | ||
|
||
import org.springframework.cloud.openfeign.FeignClient; | ||
import org.springframework.http.MediaType; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestParam; | ||
|
||
@FeignClient(name = "kakaoAuthClient", url = "${oauth2.kakao.auth-url}") | ||
public interface KakaoAuthClient { | ||
|
||
@PostMapping(value = "/oauth/token", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) | ||
KakaoToken getToken( | ||
@RequestParam("client_id") String clientId, | ||
@RequestParam("redirect_uri") String redirectUri, | ||
@RequestParam("code") String code, | ||
@RequestParam("grant_type") String grantType, | ||
@RequestParam("client_secret") String clientSecret | ||
); | ||
} |
Oops, something went wrong.