Skip to content

Commit

Permalink
Feature: Client 모듈 설정 및 OAuth 관련 RestClient 구현
Browse files Browse the repository at this point in the history
Feature: Client 모듈 설정 및 OAuth 관련 RestClient 구현
  • Loading branch information
lcomment authored May 2, 2024
2 parents 6b958ff + 83c2f12 commit 67c1bef
Show file tree
Hide file tree
Showing 13 changed files with 175 additions and 8 deletions.
4 changes: 2 additions & 2 deletions cakk-api/build.gradle
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
description = "api module"

dependencies {
implementation(project(':cakk-common'))
implementation(project(':cakk-domain'))
implementation project(':cakk-common')
implementation project(':cakk-domain')

// basic
implementation('org.springframework.boot:spring-boot-starter-web')
Expand Down
16 changes: 16 additions & 0 deletions cakk-client/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
description = 'client module'

dependencies {
implementation project(':cakk-common')

implementation('org.springframework.boot:spring-boot-starter-web')
implementation('com.google.api-client:google-api-client-jackson2:2.2.0')
implementation('com.google.api-client:google-api-client:2.2.0')
}

bootJar {
enabled = false
}
jar {
enabled = true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.cakk.client.config;

import java.time.Duration;

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestClient;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestClientConfig {

@Bean
public RestClient restClient() {
RestTemplate restTemplate = new RestTemplateBuilder()
.setConnectTimeout(Duration.ofSeconds(10))
.setReadTimeout(Duration.ofSeconds(5))
.build();

return RestClient.create(restTemplate);
}
}
11 changes: 11 additions & 0 deletions cakk-client/src/main/java/com/cakk/client/vo/OidcPublicKey.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.cakk.client.vo;

public record OidcPublicKey(
String kid,
String kty,
String alg,
String use,
String n,
String e
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.cakk.client.vo;

import static com.cakk.common.enums.ReturnCode.*;

import java.util.List;

import com.cakk.common.exception.CakkException;

public record OidcPublicKeyList(
List<OidcPublicKey> keys
) {

public OidcPublicKey getMatchedKey(String kid, String alg) {
return keys.stream()
.filter(key -> key.kid().equals(kid) && key.alg().equals(alg))
.findAny()
.orElseThrow(() -> new CakkException(EXTERNAL_SERVER_ERROR));
}
}
26 changes: 26 additions & 0 deletions cakk-client/src/main/java/com/cakk/client/web/AppleAuthClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.cakk.client.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;

import lombok.RequiredArgsConstructor;

import com.cakk.client.vo.OidcPublicKeyList;

@Component
@RequiredArgsConstructor
public class AppleAuthClient {

private final RestClient restClient;

@Value("${oauth.apple.public-key-url}")
private final String publicKeyUrl;

public OidcPublicKeyList getPublicKeys() {
return restClient.get()
.uri(publicKeyUrl)
.retrieve()
.body(OidcPublicKeyList.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.cakk.client.web;

import java.util.Collections;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;

import lombok.RequiredArgsConstructor;

@Configuration
@RequiredArgsConstructor
public class GoogleAuthConfiguration {

@Value("${oauth.google.client-id}")
private String googleClientId;

@Bean
public GoogleIdTokenVerifier googleIdTokenVerifier() {
return new GoogleIdTokenVerifier
.Builder(new NetHttpTransport(), new GsonFactory())
.setAudience(Collections.singletonList(googleClientId))
.build();
}
}
26 changes: 26 additions & 0 deletions cakk-client/src/main/java/com/cakk/client/web/KakaoAuthClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.cakk.client.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;

import lombok.RequiredArgsConstructor;

import com.cakk.client.vo.OidcPublicKeyList;

@Component
@RequiredArgsConstructor
public class KakaoAuthClient {

private final RestClient restClient;

@Value("${oauth.kakao.public-key-url}")
private final String publicKeyUrl;

public OidcPublicKeyList getPublicKeys() {
return restClient.get()
.uri(publicKeyUrl)
.retrieve()
.body(OidcPublicKeyList.class);
}
}
7 changes: 7 additions & 0 deletions cakk-client/src/main/resources/client-local.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
oauth:
kakao:
public-key-info: https://kauth.kakao.com/.well-known/jwks.json
apple:
public-key-url: https://appleid.apple.com/auth/keys
google:
client-id: ${GOOGLE_CLIENT_ID}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@
@RequiredArgsConstructor
public enum ReturnCode {

SUCCESS("1000", "요청에 성공하셨습니다.");
SUCCESS("1000", "요청에 성공하셨습니다."),

// 서버 에러 (9998, 9999)
INTERNAL_SERVER_ERROR("9998", "내부 서버 에러 입니다."),
EXTERNAL_SERVER_ERROR("9999", "외부 서버 에러 입니다.");

private final String code;
private final String message;
Expand Down
2 changes: 1 addition & 1 deletion cakk-domain/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
description = "domain module"

dependencies {
implementation(project(':cakk-common'))
implementation project(':cakk-common')

// jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@ public class User extends AuditEntity {
@Column(name = "nickname", length = 20, nullable = false)
private String nickname;

@Column(name = "email", length = 20, nullable = false)
@Column(name = "profile_image_url", length = 200)
private String profileImageUrl;

@Column(name = "email", length = 50, nullable = false)
private String email;

@Enumerated(value = EnumType.STRING)
Expand All @@ -68,6 +71,7 @@ public User(
Provider provider,
String providerId,
String nickname,
String profileImageUrl,
String email,
Gender gender,
LocalDate birthday,
Expand All @@ -76,6 +80,7 @@ public User(
this.provider = provider;
this.providerId = providerId;
this.nickname = nickname;
this.profileImageUrl = profileImageUrl;
this.email = email;
this.gender = gender;
this.birthday = birthday;
Expand Down
7 changes: 4 additions & 3 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
rootProject.name = 'cakk'

include(
'cakk-api',
'cakk-domain',
'cakk-common'
'cakk-api',
'cakk-client',
'cakk-domain',
'cakk-common'
)

0 comments on commit 67c1bef

Please sign in to comment.