-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[LIME-122] 카카오 소셜 로그인 처리 방식 수정 #63
Merged
Merged
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
8695497
chore : 소셜로그인 사용 방식 변경으로 인한 oauth2의존성 제거
HandmadeCloud 285f2a4
feat : 카카오 소셜로그인 code를 받아 처리하는 비즈니스 로직 구현
HandmadeCloud 17d4d60
refactor : 소셜 id long타입으로 변경
HandmadeCloud 098c363
feat : 카카오 전용 토큰 요청 및 수신 dto 생성
HandmadeCloud 71911d1
refactor: 카카오 소셜로그인 방식 변경으로 인한 security 설정 변경
HandmadeCloud e145506
refactor : property 추가로 인한 스캔 범위 수정
HandmadeCloud 5d9ba7d
chore : 개행 수정
HandmadeCloud 9c935dd
fix : gradle 소셜로그인 의존성 제거 및 프로퍼티 적용 의존성 추가
HandmadeCloud 79aa60c
chore : 각종 handler, entrypoint 시도중
HandmadeCloud 9dd6d04
chore : 파일 이동
HandmadeCloud 68683b6
refactor : 인가처리 단계에서 권한 확인 후 인증처리 전 프로필 업데이트 양식으로 리다이렉트 처리
HandmadeCloud f2332eb
chore : 사용하지 않는 코드 정리
HandmadeCloud 188a92a
refactor : join페이지로 리다이렉트, 해당 권한 승인 처리
HandmadeCloud 05d9cf0
refactor : refreshToken전달방식 변경
HandmadeCloud 2f94280
chore : 컨벤션 및 사용 문법 수정
HandmadeCloud 852f50e
refactor : 레이어 역참조 문제 해결
HandmadeCloud File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
30 changes: 0 additions & 30 deletions
30
lime-api/src/main/java/com/programmers/lime/domains/auth/CustomOauth2User.java
This file was deleted.
Oops, something went wrong.
55 changes: 55 additions & 0 deletions
55
lime-api/src/main/java/com/programmers/lime/domains/auth/api/AuthController.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,55 @@ | ||
package com.programmers.lime.domains.auth.api; | ||
|
||
import static com.programmers.lime.domains.member.api.MemberController.*; | ||
import static org.springframework.http.HttpHeaders.*; | ||
|
||
import org.springframework.http.ResponseCookie; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.GetMapping; | ||
import org.springframework.web.bind.annotation.RequestParam; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import com.programmers.lime.domains.auth.api.dto.MemberLoginResponse; | ||
import com.programmers.lime.domains.auth.application.OAuthUserService; | ||
import com.programmers.lime.domains.auth.application.dto.MemberLoginServiceResponse; | ||
|
||
import jakarta.servlet.http.HttpServletResponse; | ||
import lombok.RequiredArgsConstructor; | ||
|
||
@RequiredArgsConstructor | ||
@RestController | ||
public class AuthController { | ||
|
||
private final OAuthUserService oauthUserService; | ||
|
||
@GetMapping("/auth/kakao/callback") | ||
public ResponseEntity<MemberLoginResponse> loginKakao( | ||
@RequestParam final String code, | ||
HttpServletResponse response | ||
) { | ||
MemberLoginServiceResponse loginServiceResponse = oauthUserService.login(code); | ||
sendRefreshToken(response, loginServiceResponse); | ||
|
||
return ResponseEntity.ok(MemberLoginResponse.from(loginServiceResponse)); | ||
} | ||
|
||
@GetMapping("/join") | ||
public ResponseEntity<String> join(){ | ||
return ResponseEntity.ok("join"); | ||
} | ||
|
||
private void sendRefreshToken( | ||
final HttpServletResponse response, | ||
final MemberLoginServiceResponse loginResponse | ||
) { | ||
final ResponseCookie cookie = ResponseCookie.from("refresh-token", loginResponse.refreshToken()) | ||
.maxAge(COOKIE_AGE_SECONDS) | ||
.secure(true) | ||
.httpOnly(true) | ||
.sameSite("None") | ||
.path("/") | ||
.build(); | ||
|
||
response.addHeader(SET_COOKIE, String.valueOf(cookie)); | ||
} | ||
} |
47 changes: 47 additions & 0 deletions
47
lime-api/src/main/java/com/programmers/lime/domains/auth/api/dto/KakaoMemberResponse.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,47 @@ | ||
package com.programmers.lime.domains.auth.api.dto; | ||
|
||
import static com.programmers.lime.domains.member.domain.vo.SocialType.*; | ||
|
||
import java.util.UUID; | ||
|
||
import com.fasterxml.jackson.databind.PropertyNamingStrategies; | ||
import com.fasterxml.jackson.databind.annotation.JsonNaming; | ||
import com.programmers.lime.domains.member.domain.Member; | ||
import com.programmers.lime.domains.member.domain.vo.Role; | ||
import com.programmers.lime.domains.member.domain.vo.SocialInfo; | ||
|
||
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) | ||
public record KakaoMemberResponse( | ||
Long id, //카카오 소셜 id | ||
|
||
KakaoAccount kakaoAccount | ||
|
||
) { | ||
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) | ||
public record KakaoAccount( | ||
String email, | ||
Profile profile | ||
) { | ||
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) | ||
public record Profile( | ||
String profileImageUrl | ||
) { | ||
} | ||
} | ||
|
||
public Member toEntity(){ | ||
SocialInfo socialInfo = SocialInfo.builder() | ||
.socialId(this.id) | ||
.email(this.kakaoAccount.email) | ||
.profileImage(this.kakaoAccount.profile.profileImageUrl) | ||
.role(Role.GUEST) | ||
.socialType(KAKAO) | ||
.build(); | ||
|
||
long timestamp = System.currentTimeMillis(); | ||
String randomString = String.valueOf(UUID.randomUUID()).replace("-", "").substring(0, 8); | ||
String randomNickname = timestamp + randomString; | ||
|
||
return new Member(socialInfo, randomNickname); | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
lime-api/src/main/java/com/programmers/lime/domains/auth/api/dto/KakaoOAuthLoginInfo.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,12 @@ | ||
package com.programmers.lime.domains.auth.api.dto; | ||
|
||
import org.springframework.boot.context.properties.ConfigurationProperties; | ||
|
||
@ConfigurationProperties(prefix = "oauth.kakao.login") | ||
public record KakaoOAuthLoginInfo( | ||
String grantType, | ||
String clientId, | ||
String clientSecret, | ||
String redirectUri | ||
) { | ||
} |
13 changes: 13 additions & 0 deletions
13
lime-api/src/main/java/com/programmers/lime/domains/auth/api/dto/MemberLoginResponse.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,13 @@ | ||
package com.programmers.lime.domains.auth.api.dto; | ||
|
||
import com.programmers.lime.domains.auth.application.dto.MemberLoginServiceResponse; | ||
|
||
public record MemberLoginResponse( | ||
Long memberId, | ||
String nickname, | ||
String accessToken | ||
) { | ||
public static MemberLoginResponse from(final MemberLoginServiceResponse response) { | ||
return new MemberLoginResponse(response.memberId(), response.nickname(), response.accessToken()); | ||
} | ||
} |
14 changes: 14 additions & 0 deletions
14
...api/src/main/java/com/programmers/lime/domains/auth/api/dto/OAuthAccessTokenResponse.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,14 @@ | ||
package com.programmers.lime.domains.auth.api.dto; | ||
|
||
import com.fasterxml.jackson.databind.PropertyNamingStrategies; | ||
import com.fasterxml.jackson.databind.annotation.JsonNaming; | ||
|
||
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) | ||
public record OAuthAccessTokenResponse( | ||
String tokenType, | ||
String accessToken, | ||
Integer expiresIn, | ||
String refreshToken, | ||
Integer refreshTokenExpiresIn | ||
) { | ||
} |
71 changes: 71 additions & 0 deletions
71
lime-api/src/main/java/com/programmers/lime/domains/auth/application/KakaoOAuthClient.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,71 @@ | ||
package com.programmers.lime.domains.auth.application; | ||
|
||
import org.springframework.http.HttpEntity; | ||
import org.springframework.http.HttpHeaders; | ||
import org.springframework.http.HttpMethod; | ||
import org.springframework.http.MediaType; | ||
import org.springframework.stereotype.Component; | ||
import org.springframework.util.LinkedMultiValueMap; | ||
import org.springframework.util.MultiValueMap; | ||
import org.springframework.web.client.RestTemplate; | ||
|
||
import com.programmers.lime.domains.auth.api.dto.KakaoMemberResponse; | ||
import com.programmers.lime.domains.auth.api.dto.KakaoOAuthLoginInfo; | ||
import com.programmers.lime.domains.auth.api.dto.OAuthAccessTokenResponse; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class KakaoOAuthClient { | ||
|
||
private static final RestTemplate restTemplate = new RestTemplate(); | ||
private final KakaoOAuthLoginInfo kakaoOAuthLoginInfo; | ||
|
||
public String getAccessToken(final String code) { | ||
MultiValueMap<String, String> loginInfoRequest = makeKakaoLoginInfo(code); | ||
HttpHeaders headers = new HttpHeaders(); | ||
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); | ||
|
||
HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(loginInfoRequest, headers); | ||
|
||
OAuthAccessTokenResponse response = restTemplate.postForEntity( | ||
"https://kauth.kakao.com/oauth/token", | ||
httpEntity, | ||
OAuthAccessTokenResponse.class | ||
).getBody(); | ||
|
||
return response.accessToken(); | ||
} | ||
|
||
private MultiValueMap<String, String> makeKakaoLoginInfo(final String code) { | ||
MultiValueMap<String, String> loginInfoRequest = new LinkedMultiValueMap<>(); | ||
|
||
loginInfoRequest.add("grant_type", kakaoOAuthLoginInfo.grantType()); | ||
loginInfoRequest.add("client_id", kakaoOAuthLoginInfo.clientId()); | ||
loginInfoRequest.add("client_secret", kakaoOAuthLoginInfo.clientSecret()); | ||
loginInfoRequest.add("redirect_uri", kakaoOAuthLoginInfo.redirectUri()); | ||
loginInfoRequest.add("code", code); | ||
|
||
return loginInfoRequest; | ||
} | ||
|
||
public KakaoMemberResponse getMemberInfo(final String accessToken) { | ||
HttpHeaders headers = new HttpHeaders(); | ||
headers.setBearerAuth(accessToken); | ||
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); | ||
|
||
HttpEntity<Void> request = new HttpEntity<>(headers); | ||
|
||
KakaoMemberResponse response = restTemplate.exchange( | ||
"https://kapi.kakao.com/v2/user/me", | ||
HttpMethod.GET, | ||
request, | ||
KakaoMemberResponse.class | ||
).getBody(); | ||
|
||
return response; | ||
} | ||
|
||
|
||
} |
45 changes: 45 additions & 0 deletions
45
lime-api/src/main/java/com/programmers/lime/domains/auth/application/OAuthUserService.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,45 @@ | ||
package com.programmers.lime.domains.auth.application; | ||
|
||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import com.programmers.lime.domains.auth.api.dto.KakaoMemberResponse; | ||
import com.programmers.lime.domains.auth.application.dto.MemberLoginServiceResponse; | ||
import com.programmers.lime.domains.member.domain.Member; | ||
import com.programmers.lime.domains.member.domain.vo.SocialType; | ||
import com.programmers.lime.domains.member.implementation.MemberAppender; | ||
import com.programmers.lime.domains.member.implementation.MemberReader; | ||
import com.programmers.lime.global.config.security.jwt.JwtService; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
public class OAuthUserService { | ||
|
||
private final KakaoOAuthClient kakaoOAuthClient; | ||
private final MemberAppender memberAppender; | ||
private final MemberReader memberReader; | ||
private final JwtService jwtService; | ||
|
||
@Transactional | ||
public MemberLoginServiceResponse login(final String code) { | ||
String kakaoAccessToken = kakaoOAuthClient.getAccessToken(code); | ||
KakaoMemberResponse response = kakaoOAuthClient.getMemberInfo(kakaoAccessToken); | ||
|
||
Member foundMember = memberReader.readBySocialIdAndSocialType( | ||
response.id(), | ||
SocialType.KAKAO | ||
).orElseGet(() -> saveMember(response)); | ||
|
||
String accessToken = jwtService.generateAccessToken(String.valueOf(foundMember.getId())); | ||
String refreshToken = jwtService.generateRefreshToken(); | ||
|
||
return MemberLoginServiceResponse.from(foundMember, accessToken, refreshToken); | ||
} | ||
|
||
private Member saveMember(final KakaoMemberResponse response) { | ||
return memberAppender.append(response.toEntity()); | ||
} | ||
|
||
} |
23 changes: 23 additions & 0 deletions
23
...in/java/com/programmers/lime/domains/auth/application/dto/MemberLoginServiceResponse.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,23 @@ | ||
package com.programmers.lime.domains.auth.application.dto; | ||
|
||
import com.programmers.lime.domains.member.domain.Member; | ||
|
||
public record MemberLoginServiceResponse( | ||
Long memberId, | ||
String nickname, | ||
String accessToken, | ||
String refreshToken | ||
) { | ||
public static MemberLoginServiceResponse from( | ||
final Member member, | ||
final String accessToken, | ||
final String refreshToken | ||
) { | ||
return new MemberLoginServiceResponse( | ||
member.getId(), | ||
member.getNickname(), | ||
accessToken, | ||
refreshToken | ||
); | ||
} | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
p5; (단순 궁금)
오 카카오 로그인 과정에서는 snake case로 통신하나요?!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거는 카카오 개발자 센터에서 제공해주는 정해진 양식이 snakeCase이기 때문에 그 형식에 맞춰 전달해줘야만 합니다~