From 897f023ef52f9ab78cbb239a7861541f5548955f Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Sun, 6 Mar 2022 01:58:11 +0900 Subject: [PATCH 1/4] =?UTF-8?q?fix=20:=20provider=EC=97=90=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=EB=90=98=EB=8A=94=20=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/banjjoknim/playground/config/security/SecurityConfiguration.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt index 2867442..038a9de 100644 --- a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt @@ -225,7 +225,7 @@ class PrincipalOAuth2UserService( // 강제로 회원가입 진행 val oAuth2User = super.loadUser(userRequest) - val provider = userRequest.clientRegistration.clientId // google + val provider = userRequest.clientRegistration.registrationId // google val providerId = oAuth2User.attributes["sub"] // googleId(PK) val username = "${provider}_${providerId}" // OAuth2 로 로그인시, 필요 없지만 그냥 만들어준다. val password = passwordEncoder.encode("비밀번호") // OAuth2 로 로그인시, 필요 없지만 그냥 만들어준다. From 639d51eb280ac4015f5e3481a0a3b37e1d4cf25d Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Sun, 6 Mar 2022 02:18:27 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat(auth)=20:=20OAuth2=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EA=B4=80=EB=A0=A8=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../playground/domain/auth/OAuth2UserInfo.kt | 12 ++++ .../playground/domain/auth/OAuth2UserInfos.kt | 56 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfo.kt create mode 100644 놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfo.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfo.kt new file mode 100644 index 0000000..777cb2b --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfo.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.playground.domain.auth + +interface OAuth2UserInfo { + + fun getProviderId(): String + + fun getProvider(): String + + fun getEmail(): String + + fun getName(): String +} diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt new file mode 100644 index 0000000..608cfb5 --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt @@ -0,0 +1,56 @@ +package com.banjjoknim.playground.domain.auth + +class GoogleUserInfo( + /** + * DefaultOAuth2Service#loadUser(OAuth2UserRequest) + * ```kotlin + * val oAuth2User = super.loadUser(userRequest) + * val attributes = oAuth2User.attributes + * ``` + */ + private val attributes: Map +) : OAuth2UserInfo { + override fun getProviderId(): String { + return attributes["sub"] as String + } + + override fun getProvider(): String { + return "google" + } + + override fun getEmail(): String { + return attributes["email"] as String + } + + override fun getName(): String { + return attributes["name"] as String + } +} + +class FacebookUserInfo( + /** + * DefaultOAuth2Service#loadUser(OAuth2UserRequest) + * ```kotlin + * val oAuth2User = super.loadUser(userRequest) + * val attributes = oAuth2User.attributes + * ``` + */ + private val attributes: Map +) : OAuth2UserInfo { + override fun getProviderId(): String { + return attributes["id"] as String + } + + override fun getProvider(): String { + return "facebook" + } + + override fun getEmail(): String { + return attributes["email"] as String + } + + override fun getName(): String { + return attributes["name"] as String + } + +} From 1f1275948aa1989587ccbeef0ba03afdc56cb7cc Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Sun, 6 Mar 2022 02:51:28 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor=20:=20OAuth2=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=EC=8B=9C=20OAuth2Type=20=EB=B3=84=EB=A1=9C=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=A0=95=EB=B3=B4=20=EC=96=BB=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/SecurityConfiguration.kt | 14 +++++++----- .../banjjoknim/playground/domain/auth/OAuth2Type.kt | 22 +++++++++++++++++++ .../playground/domain/auth/OAuth2UserInfos.kt | 1 + 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2Type.kt diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt index 038a9de..e5f4e26 100644 --- a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt @@ -1,5 +1,6 @@ package com.banjjoknim.playground.config.security +import com.banjjoknim.playground.domain.auth.OAuth2Type import com.banjjoknim.playground.domain.user.User import com.banjjoknim.playground.domain.user.UserRepository import org.springframework.context.annotation.Bean @@ -224,12 +225,15 @@ class PrincipalOAuth2UserService( println("${userRequest.additionalParameters}") // 5.1 버전 이후일 경우. // 강제로 회원가입 진행 + val oAuth2Type = OAuth2Type.findByProvider(userRequest.clientRegistration.registrationId) val oAuth2User = super.loadUser(userRequest) - val provider = userRequest.clientRegistration.registrationId // google - val providerId = oAuth2User.attributes["sub"] // googleId(PK) + val oAuth2UserInfo = oAuth2Type.createOAuth2UserInfo(oAuth2User.attributes) + + val provider = oAuth2UserInfo.getProvider() // 값의 유무로 일반 로그인, OAuth2 로그인을 구분한다. + val providerId = oAuth2UserInfo.getProviderId() val username = "${provider}_${providerId}" // OAuth2 로 로그인시, 필요 없지만 그냥 만들어준다. val password = passwordEncoder.encode("비밀번호") // OAuth2 로 로그인시, 필요 없지만 그냥 만들어준다. - val email = oAuth2User.attributes["email"] + val email = oAuth2UserInfo.getEmail() val role = "ROLE_USER" // 회원가입 여부 확인 및 저장 @@ -238,10 +242,10 @@ class PrincipalOAuth2UserService( user = User( username = username, password = password, - email = email as String, + email = email, role = role, provider = provider, - providerId = providerId as String + providerId = providerId ) userRepository.save(user) // 회원정보 저장 diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2Type.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2Type.kt new file mode 100644 index 0000000..c19f85c --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2Type.kt @@ -0,0 +1,22 @@ +package com.banjjoknim.playground.domain.auth + +enum class OAuth2Type( + private val provider: String, + private val createUserInfo: (attributes: Map) -> OAuth2UserInfo +) { + GOOGLE("google", { attributes -> GoogleUserInfo(attributes) }), + FACEBOOK("facebook", { attributes -> FacebookUserInfo(attributes) }); + + fun createOAuth2UserInfo(attributes: Map): OAuth2UserInfo { + return createUserInfo(attributes) + } + + companion object { + fun findByProvider(provider: String): OAuth2Type { + return values() + .find { oAuth2Type -> oAuth2Type.provider == provider } + ?: throw IllegalArgumentException("존재하지 않는 OAuth2 인증 타입입니다.") + } + } +} + diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt index 608cfb5..c145b7f 100644 --- a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt @@ -10,6 +10,7 @@ class GoogleUserInfo( */ private val attributes: Map ) : OAuth2UserInfo { + override fun getProviderId(): String { return attributes["sub"] as String } From 4fddf60d871b6267ec32bf9d525187b045c1db2f Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Sun, 6 Mar 2022 03:22:14 +0900 Subject: [PATCH 4/4] =?UTF-8?q?chore=20:=20=EC=84=A4=EC=A0=95=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=9D=BC=EB=B6=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring-security/src/main/resources/application.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/resources/application.yml b/놀이터(예제 코드 작성)/spring-security/src/main/resources/application.yml index 8315fd0..79ecb78 100644 --- a/놀이터(예제 코드 작성)/spring-security/src/main/resources/application.yml +++ b/놀이터(예제 코드 작성)/spring-security/src/main/resources/application.yml @@ -6,6 +6,13 @@ spring: google: client-id: my-google-client-id client-secret: my-google-client-secret + scope: + - email + - profile + facebook: client-id: my-facebook-client-id client-secret: my-facebook-client-secret + scope: + - email + - public_profile