Skip to content

Commit

Permalink
Merge pull request #27 from swyp3-babpool/fix/get-token-from-kakao
Browse files Browse the repository at this point in the history
fix(auth): Get token from kakao
  • Loading branch information
proHyundo authored Mar 3, 2024
2 parents da2e54a + 5ea2287 commit c72140c
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public enum AuthExceptionErrorCode implements CustomErrorCode {
AUTH_TOKEN_EXPIRED(HttpStatus.BAD_REQUEST,"유효하지 않은 토큰입니다."),
AUTH_MALFORMED_TOKEN(HttpStatus.UNAUTHORIZED,"올바르지 않은 토큰입니다."),
AUTH_UNSUPPORTED_ID_TOKEN_TYPE(HttpStatus.UNAUTHORIZED,"OAuth Identity Token의 형식이 올바르지 않습니다."),
AUTH_PUBLIC_KEY_ERROR(HttpStatus.UNAUTHORIZED,"OAuth Public Key 생성 중 오류가 발생했습니다.");
AUTH_PUBLIC_KEY_ERROR(HttpStatus.UNAUTHORIZED,"OAuth Public Key 생성 중 오류가 발생했습니다."),
AUTH_ERROR_CONNECT_WITH_KAKAO(HttpStatus.INTERNAL_SERVER_ERROR,"Kakao로부터 id Token을 응답받는 과정 중 오류가 발생했습니다.");

private final HttpStatus httpStatus;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.swyp3.babpool.infra.auth.kakao;

import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.swyp3.babpool.infra.auth.exception.AuthException;
import com.swyp3.babpool.infra.auth.exception.errorcode.AuthExceptionErrorCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

@Slf4j
@Component
@RequiredArgsConstructor
public class KakaoTokenProvider {
private String reqURL = "https://kauth.kakao.com/oauth/token";
@Value("${property.oauth.kakao.client-id}")
private String clientId;
@Value("${property.oauth.kakao.redirect-uri}")
private String redirectUri;
@Value("${property.oauth.kakao.client-secret}")
private String clientSecret;

public String getIdTokenFromKakao(String code) {
String idToken;

try {
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
StringBuilder sb = new StringBuilder();

sb.append("grant_type=authorization_code");
sb.append("&client_id="+clientId);
sb.append("&redirect_uri="+redirectUri);
sb.append("&client_secret="+clientSecret);
sb.append("&code=" + code);

bw.write(sb.toString());
bw.flush();

BufferedReader br;

if (conn.getResponseCode() >= 400) {
br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
} else {
br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
}

String line;
StringBuilder responseSb = new StringBuilder();

while ((line = br.readLine()) != null) {
responseSb.append(line);
}

String result = responseSb.toString();
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);


// 에러 응답이면 에러 메시지를 가져옴
if (conn.getResponseCode() >= 400) {
String errorMessage = element.getAsJsonObject().get("error_description").getAsString();
throw new AuthException(AuthExceptionErrorCode.AUTH_ERROR_CONNECT_WITH_KAKAO,
errorMessage);
}
// 정상 응답이면 id Token을 가져옴
else{
idToken = element.getAsJsonObject().get("id_token").getAsString();
log.info("카카오로부터 Token 성공적으로 조회");
br.close();

return idToken;
}
} catch (IOException e) {
e.printStackTrace();
throw new AuthException(AuthExceptionErrorCode.AUTH_ERROR_CONNECT_WITH_KAKAO,
e.getMessage().toString());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

@Getter
public class LoginRequestDTO {
@NotNull(message = "요청 정보가 유효하지 않습니다.")
@NotNull(message = "authPlatform 값은 필수입니다.")
private AuthPlatform authPlatform;
@NotNull(message = "요청 정보가 유효하지 않습니다.")
private String idToken;
@NotNull(message = "code 값은 필수입니다.")
private String code;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.swyp3.babpool.infra.auth.service;

import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.swyp3.babpool.domain.user.dao.UserRepository;
import com.swyp3.babpool.domain.user.domain.User;
import com.swyp3.babpool.domain.user.domain.UserRole;
Expand All @@ -8,17 +10,26 @@
import com.swyp3.babpool.global.uuid.application.UuidService;
import com.swyp3.babpool.infra.auth.AuthPlatform;
import com.swyp3.babpool.infra.auth.domain.Auth;
import com.swyp3.babpool.infra.auth.exception.AuthException;
import com.swyp3.babpool.infra.auth.exception.errorcode.AuthExceptionErrorCode;
import com.swyp3.babpool.infra.auth.kakao.KakaoMemberProvider;
import com.swyp3.babpool.infra.auth.dao.AuthRepository;
import com.swyp3.babpool.infra.auth.kakao.KakaoTokenProvider;
import com.swyp3.babpool.infra.auth.response.AuthMemberResponse;
import com.swyp3.babpool.infra.auth.request.LoginRequestDTO;
import com.swyp3.babpool.infra.auth.response.LoginResponseDTO;
import com.swyp3.babpool.infra.auth.response.LoginResponseWithRefreshToken;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.UUID;
Expand All @@ -29,13 +40,15 @@
@RequiredArgsConstructor
public class AuthService {
private final KakaoMemberProvider kakaoMemberProvider;
private final KakaoTokenProvider kakaoTokenProvider;
private final UserRepository userRepository;
private final AuthRepository authRepository;
private final JwtService jwtService;
private final UuidService uuidService;

public LoginResponseWithRefreshToken kakaoLogin(LoginRequestDTO loginRequest) {
AuthMemberResponse kakaoPlatformMember = kakaoMemberProvider.getKakaoPlatformMember(loginRequest.getIdToken());
String idToken = kakaoTokenProvider.getIdTokenFromKakao(loginRequest.getCode());
AuthMemberResponse kakaoPlatformMember = kakaoMemberProvider.getKakaoPlatformMember(idToken);
return generateLoginResponse(AuthPlatform.KAKAO,kakaoPlatformMember);
}

Expand Down

0 comments on commit c72140c

Please sign in to comment.