Skip to content

feat: 카카오 access token으로 유저 정보 가져오기 #159

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

Merged
merged 2 commits into from
Mar 19, 2024
Merged
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 @@ -2,7 +2,9 @@

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import sunflower.server.auth.client.KakaoOAuthClient;
import sunflower.server.auth.client.KakaoAccessTokenClient;
import sunflower.server.auth.client.KakaoUserProfileClient;
import sunflower.server.auth.client.response.KakaoOAuthResponse;

@Service
public class KakaoMemberService {
Expand All @@ -11,28 +13,37 @@ public class KakaoMemberService {
private final String restApiKey;
private final String authCodeURI;
private final String authTokenURI;
private final KakaoOAuthClient kakaoOAuthClient;
private final String userProfileURI;
private final KakaoAccessTokenClient kakaoAccessTokenClient;
private final KakaoUserProfileClient kakaoUserProfileClient;

public KakaoMemberService(
@Value("${oauth.kakao.rest-api-key}") String restApiKey,
@Value("${oauth.kakao.redirect-uri}") String redirectURI,
@Value("${oauth.kakao.auth-code-uri}") String authCodeURI,
@Value("${oauth.kakao.token-uri}") String authTokenURI,
final KakaoOAuthClient kakaoOAuthClient
@Value("${oauth.kakao.user-info-request-uri}") String userProfileURI,
final KakaoAccessTokenClient kakaoAccessTokenClient,
final KakaoUserProfileClient kakaoUserProfileClient
) {
this.redirectURI = redirectURI;
this.restApiKey = restApiKey;
this.authCodeURI = authCodeURI;
this.authTokenURI = authTokenURI;
this.kakaoOAuthClient = kakaoOAuthClient;
this.userProfileURI = userProfileURI;
this.kakaoAccessTokenClient = kakaoAccessTokenClient;
this.kakaoUserProfileClient = kakaoUserProfileClient;
}

public String loginURI() {
return String.format(authCodeURI, restApiKey, redirectURI);
}

public String login(final String code) {
kakaoOAuthClient.login(authTokenURI, restApiKey, redirectURI, code);
final KakaoOAuthResponse response = kakaoAccessTokenClient.requestAccessToken(authTokenURI, restApiKey, redirectURI, code);
final String accessToken = response.getAccessToken();
kakaoUserProfileClient.requestUserProfile(userProfileURI, accessToken);

return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package sunflower.server.auth.client;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
Expand All @@ -11,21 +10,19 @@
import org.springframework.web.client.RestTemplate;
import sunflower.server.auth.client.response.KakaoOAuthResponse;

import java.util.Map;

@Slf4j
@Component
public class KakaoOAuthClient {
public class KakaoAccessTokenClient {

private final ObjectMapper objectMapper = new ObjectMapper();
private static final String GRANT_TYPE = "authorization_code";
private final RestTemplate restTemplate;

public KakaoOAuthClient(final RestTemplate restTemplate) {
public KakaoAccessTokenClient(final RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}

public void login(final String authTokenURI, final String restApiKey, final String redirectURI, final String code) {
public KakaoOAuthResponse requestAccessToken(final String authTokenURI, final String restApiKey, final String redirectURI, final String code) {
final String requestURI = authTokenURI;
HttpHeaders requestHeader = createRequestHeader();
final MultiValueMap<String, Object> requestBody = createRequestBody(restApiKey, redirectURI, code);
Expand All @@ -35,7 +32,13 @@ public void login(final String authTokenURI, final String restApiKey, final Stri
log.info("Request Headers: {}", requestHeader);
log.info("Request Parameters: {}", requestBody);

final KakaoOAuthResponse response = restTemplate.postForObject(requestURI, requestEntity, KakaoOAuthResponse.class);
return restTemplate.postForObject(requestURI, requestEntity, KakaoOAuthResponse.class);
}

private HttpHeaders createRequestHeader() {
HttpHeaders requestHeader = new HttpHeaders();
requestHeader.set(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
return requestHeader;
}

private MultiValueMap<String, Object> createRequestBody(final String restApiKey, final String redirectURI, final String code) {
Expand All @@ -48,18 +51,4 @@ private MultiValueMap<String, Object> createRequestBody(final String restApiKey,

return requestBody;
}

private String convertToJson(final Map<String, Object> body) {
try {
return objectMapper.writeValueAsString(body);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}

private HttpHeaders createRequestHeader() {
HttpHeaders requestHeader = new HttpHeaders();
requestHeader.set("Content-Type", "application/x-www-form-urlencoded");
return requestHeader;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package sunflower.server.auth.client;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Component
public class KakaoUserProfileClient {

private final RestTemplate restTemplate;

public KakaoUserProfileClient(
final RestTemplate restTemplate
) {
this.restTemplate = restTemplate;
}

public void requestUserProfile(
final String requestURI,
final String accessToken
) {
HttpHeaders requestHeader = createRequestHeader(accessToken);
final HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(null, requestHeader);

log.info("Request URI: {}", requestURI);
log.info("Request Headers: {}", requestHeader);

final ResponseEntity<String> response = restTemplate.exchange(requestURI, HttpMethod.GET, requestEntity, String.class);

final String responseBody = response.getBody();
System.out.println("responseBody = " + responseBody);
}

private HttpHeaders createRequestHeader(final String accessToken) {
HttpHeaders requestHeader = new HttpHeaders();
requestHeader.set(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
requestHeader.set(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded;charset=utf-8");
return requestHeader;
}
}
2 changes: 1 addition & 1 deletion server/src/main/resources/security
1 change: 1 addition & 0 deletions server/src/test/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ oauth:
rest-api-key: rest-api-key
auth-code-uri: auth-code-uri
token-uri: token-uri
user-info-request-uri: user-info-request-uri₩