Skip to content

Commit

Permalink
Merge pull request #140 from Me1tingPot/feature/#128
Browse files Browse the repository at this point in the history
�[Refactor] 카카오 로그인 SDK 방식으로 변경
  • Loading branch information
JangYouJung authored Jul 28, 2024
2 parents cb057d3 + 05be8db commit 3e68a16
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

public record OAuthSignInRequestDto(
OAuthType type,
String code,
String token,
String push_token
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
@Builder
@Data
public class KakaoDto {

private long id;
private String email;
private String nickname;

Expand Down
37 changes: 32 additions & 5 deletions src/main/java/meltingpot/server/auth/oauth/kakao/KakaoService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package meltingpot.server.auth.oauth.kakao;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.beans.factory.annotation.Value;
Expand All @@ -11,6 +13,7 @@
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.util.Base64;

@Service
public class KakaoService {
Expand All @@ -26,16 +29,17 @@ public class KakaoService {

private final static String KAKAO_AUTH_URI = "https://kauth.kakao.com";
private final static String KAKAO_API_URI = "https://kapi.kakao.com";
private final ObjectMapper objectMapper = new ObjectMapper();

public String getKakaoLogin(String redirect_uri) { // 프론트 구현부
return KAKAO_AUTH_URI + "/oauth/authorize"
+ "?client_id=" + KAKAO_CLIENT_ID
+ "&redirect_uri=" + redirect_uri
+ "&response_type=code";
+ "&response_type=token";
}

public KaKaoTokenDto getKakaoInfo(String code) throws Exception {
if (code == null) throw new Exception("Failed get authorization code");
public KaKaoTokenDto getKakaoToken(String code) throws Exception {
if (code == null) throw new Exception("Failed get authorization token");

String accessToken = "";
String refreshToken = "";
Expand All @@ -48,7 +52,7 @@ public KaKaoTokenDto getKakaoInfo(String code) throws Exception {
params.add("grant_type" , "authorization_code");
params.add("client_id" , KAKAO_CLIENT_ID);
params.add("client_secret", KAKAO_CLIENT_SECRET);
params.add("code" , code);
params.add("token" , code);
params.add("redirect_uri" , redirect_uri);

RestTemplate restTemplate = new RestTemplate();
Expand Down Expand Up @@ -103,7 +107,30 @@ public KakaoDto getUserInfoWithToken(String accessToken) throws Exception {
String nickname = String.valueOf(profile.get("nickname"));

return KakaoDto.builder()
.id(id)
.email(email)
.nickname(nickname).build();
}

public KakaoDto getUserInfoFromIdToken(String idToken) throws Exception {
// 온점 분리
String[] parts = idToken.split("\\.");
if (parts.length != 3) {
throw new IllegalArgumentException("Invalid IdToken");
}

// Payload 디코딩
String payload = parts[1];
String decodedPayload = new String(Base64.getDecoder().decode(payload));

// JSON 파싱
JsonNode jsonNode = objectMapper.readTree(decodedPayload);

// email과 nickname 추출
String email = jsonNode.path("email").asText(null);
String nickname = jsonNode.path("nickname").asText(null);

// 정보 담아 보내기
return KakaoDto.builder()
.email(email)
.nickname(nickname).build();
}
Expand Down
17 changes: 9 additions & 8 deletions src/main/java/meltingpot/server/auth/service/OAuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import meltingpot.server.auth.controller.dto.AccountResponseDto;
import meltingpot.server.auth.controller.dto.OAuthSignInRequestDto;
import meltingpot.server.auth.controller.dto.OAuthSignupRequestDto;
import meltingpot.server.auth.controller.dto.ProfileImageRequestDto;
import meltingpot.server.auth.oauth.OAuthUserDetails;
import meltingpot.server.auth.oauth.kakao.KaKaoTokenDto;
import meltingpot.server.auth.oauth.kakao.KakaoDto;
import meltingpot.server.auth.oauth.kakao.KakaoService;
import meltingpot.server.auth.service.dto.OAuthSignInResponseDto;
Expand All @@ -20,16 +18,12 @@
import meltingpot.server.domain.repository.RefreshTokenRepository;
import meltingpot.server.exception.AuthException;
import meltingpot.server.exception.IllegalArgumentException;
import meltingpot.server.exception.ResourceNotFoundException;
import meltingpot.server.util.ResponseCode;
import meltingpot.server.util.TokenDto;
import meltingpot.server.util.r2.FileService;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -109,6 +103,7 @@ public OAuthSignInResponseDto oauthSignup(OAuthSignupRequestDto signupRequest) {
.build()).toList()
);


account.setLanguages(signupRequest.languages().stream().map(
(language) -> AccountLanguage.builder()
.account(account)
Expand All @@ -132,11 +127,17 @@ public OAuthSignInResponseDto oauthSignup(OAuthSignupRequestDto signupRequest) {
public OAuthSignInResponseDto SNSLogin(OAuthSignInRequestDto request) throws Exception {

if(request.type() == OAuthType.KAKAO) {

/* * * * RestAPI 버전 * * * /
// 카카오 토큰 가져오기
KaKaoTokenDto tokenDto = kakaoService.getKakaoInfo(request.code());
KaKaoTokenDto tokenDto = kakaoService.getKakaoToken(request.token());
// 카카오 유저 정보 가져오기
KakaoDto kakaoDto = kakaoService.getUserInfoWithToken(tokenDto.accessToken());
KakaoDto kakaoDto = kakaoService.getUserInfoWithToken(request.token());
* * * * * * * * * * * * */

// SDK 버전: 아이디토큰으로 유저 정보 파싱해오기
KakaoDto kakaoDto = kakaoService.getUserInfoFromIdToken(request.token());

// 이미 가입한 회원인지 확인
Optional<Account> account = accountRepository.findByUsernameAndIsQuitIsFalse(kakaoDto.getEmail());
Expand Down

0 comments on commit 3e68a16

Please sign in to comment.