From b166c5edd767635b157872a0e07670e8e89d0764 Mon Sep 17 00:00:00 2001 From: dgddgd314 Date: Wed, 29 Jul 2026 14:49:06 +0900 Subject: [PATCH 1/2] feat: NAVER login impl --- app/build.gradle.kts | 7 +++++ .../hangsha_android/HangshaApplication.kt | 15 ++++++++++- .../data/repository/AuthRepository.kt | 4 ++- .../ui/navigation/HangshaNavHost.kt | 27 +++++++++++++++++-- .../ui/view/login/LoginViewModel.kt | 2 +- 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 908f88d..5983441 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -30,6 +30,7 @@ fun String.escapeForBuildConfig(): String { val kakaoNativeAppKey = readBuildConfigString("KAKAO_NATIVE_APP_KEY") val naverClientId = readBuildConfigString("NAVER_CLIENT_ID") +val naverClientSecret = readBuildConfigString("NAVER_CLIENT_SECRET") val naverClientName = readBuildConfigString("NAVER_CLIENT_NAME").ifBlank { "Hangsha" } android { @@ -67,6 +68,11 @@ android { "NAVER_CLIENT_ID", "\"${naverClientId.escapeForBuildConfig()}\"" ) + buildConfigField( + "String", + "NAVER_CLIENT_SECRET", + "\"${naverClientSecret.escapeForBuildConfig()}\"" + ) buildConfigField( "String", "NAVER_CLIENT_NAME", @@ -133,6 +139,7 @@ dependencies { implementation("com.google.android.gms:play-services-location:21.0.1") implementation("com.google.android.gms:play-services-auth:21.5.1") implementation("com.kakao.sdk:v2-user:2.24.0") + implementation("com.navercorp.nid:oauth:5.11.2") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.7.3") implementation(libs.coil.compose) implementation("androidx.emoji2:emoji2-emojipicker:1.4.0") diff --git a/app/src/main/java/com/example/hangsha_android/HangshaApplication.kt b/app/src/main/java/com/example/hangsha_android/HangshaApplication.kt index 2423dff..15804e9 100644 --- a/app/src/main/java/com/example/hangsha_android/HangshaApplication.kt +++ b/app/src/main/java/com/example/hangsha_android/HangshaApplication.kt @@ -2,6 +2,7 @@ package com.example.hangsha_android import android.app.Application import com.kakao.sdk.common.KakaoSdk +import com.navercorp.nid.NidOAuth import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp @@ -12,5 +13,17 @@ class HangshaApplication : Application() { if (BuildConfig.KAKAO_NATIVE_APP_KEY.isNotBlank()) { KakaoSdk.init(this, BuildConfig.KAKAO_NATIVE_APP_KEY) } + + if ( + BuildConfig.NAVER_CLIENT_ID.isNotBlank() && + BuildConfig.NAVER_CLIENT_SECRET.isNotBlank() + ) { + NidOAuth.initialize( + context = this, + clientId = BuildConfig.NAVER_CLIENT_ID, + clientSecret = BuildConfig.NAVER_CLIENT_SECRET, + clientName = BuildConfig.NAVER_CLIENT_NAME + ) + } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/hangsha_android/data/repository/AuthRepository.kt b/app/src/main/java/com/example/hangsha_android/data/repository/AuthRepository.kt index 4a920b8..7230ebd 100644 --- a/app/src/main/java/com/example/hangsha_android/data/repository/AuthRepository.kt +++ b/app/src/main/java/com/example/hangsha_android/data/repository/AuthRepository.kt @@ -1,4 +1,4 @@ -package com.example.hangsha_android.data.repository +package com.example.hangsha_android.data.repository import com.example.hangsha_android.data.network.api.AuthApi import com.example.hangsha_android.data.network.model.LoginRequest @@ -100,3 +100,5 @@ class AuthRepository @Inject constructor( private const val MOBILE_CLIENT_TYPE = "MOB" } } + + diff --git a/app/src/main/java/com/example/hangsha_android/ui/navigation/HangshaNavHost.kt b/app/src/main/java/com/example/hangsha_android/ui/navigation/HangshaNavHost.kt index b3ed8a2..2a873f8 100644 --- a/app/src/main/java/com/example/hangsha_android/ui/navigation/HangshaNavHost.kt +++ b/app/src/main/java/com/example/hangsha_android/ui/navigation/HangshaNavHost.kt @@ -71,6 +71,8 @@ import com.kakao.sdk.auth.model.OAuthToken import com.kakao.sdk.common.model.ClientError import com.kakao.sdk.common.model.ClientErrorCause import com.kakao.sdk.user.UserApiClient +import com.navercorp.nid.NidOAuth +import com.navercorp.nid.oauth.util.NidOAuthCallback sealed class HangshaDestinations(val route: String) { data object Splash : HangshaDestinations("splash") @@ -211,6 +213,21 @@ fun NavGraphBuilder.loginGraph(navController: NavHostController) { loginViewModel.loginWithKakao(token?.accessToken) } } + val naverLoginCallback = remember(loginViewModel) { + object : NidOAuthCallback { + override fun onSuccess() { + loginViewModel.loginWithNaver(NidOAuth.getAccessToken()) + } + + override fun onFailure(errorCode: String, errorDesc: String) { + Log.e( + "AuthLog", + "Naver login failed: errorCode=$errorCode, errorDesc=$errorDesc" + ) + loginViewModel.onNaverLoginError(errorDesc.ifBlank { "Naver login failed." }) + } + } + } LaunchedEffect(loginUiState.isLoginSuccessful) { if (!loginUiState.isLoginSuccessful) { @@ -270,8 +287,14 @@ fun NavGraphBuilder.loginGraph(navController: NavHostController) { } }, onNaverLoginClick = { - // TODO(NAVER_LOGIN): Decide how to handle Naver client secret before enabling the native SDK login flow. - loginViewModel.onNaverLoginConfigMissing() + if ( + BuildConfig.NAVER_CLIENT_ID.isBlank() || + BuildConfig.NAVER_CLIENT_SECRET.isBlank() + ) { + loginViewModel.onNaverLoginConfigMissing() + } else { + NidOAuth.requestLogin(context, naverLoginCallback) + } }, onGuestContinueClick = { loginViewModel.continueAsGuest() diff --git a/app/src/main/java/com/example/hangsha_android/ui/view/login/LoginViewModel.kt b/app/src/main/java/com/example/hangsha_android/ui/view/login/LoginViewModel.kt index 69c00d0..00f0d85 100644 --- a/app/src/main/java/com/example/hangsha_android/ui/view/login/LoginViewModel.kt +++ b/app/src/main/java/com/example/hangsha_android/ui/view/login/LoginViewModel.kt @@ -90,7 +90,7 @@ class LoginViewModel @Inject constructor( } fun onNaverLoginConfigMissing() { - onAuthFailure("Naver login requires a client secret handling decision before enabling.") + onAuthFailure("Naver login is not configured yet.") } fun onGoogleLoginCancelled() { From 8741a78140e0498a01584d2536cd340d313bfaa7 Mon Sep 17 00:00:00 2001 From: dgddgd314 Date: Thu, 30 Jul 2026 18:41:23 +0900 Subject: [PATCH 2/2] feat: google login logic null -> empty --- .../example/hangsha_android/data/repository/AuthRepository.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/example/hangsha_android/data/repository/AuthRepository.kt b/app/src/main/java/com/example/hangsha_android/data/repository/AuthRepository.kt index 7230ebd..74e49db 100644 --- a/app/src/main/java/com/example/hangsha_android/data/repository/AuthRepository.kt +++ b/app/src/main/java/com/example/hangsha_android/data/repository/AuthRepository.kt @@ -28,7 +28,7 @@ class AuthRepository @Inject constructor( SocialLoginRequest( provider = GOOGLE_PROVIDER, code = serverAuthCode, - codeVerifier = null, + codeVerifier = "", clientType = MOBILE_CLIENT_TYPE ) ) @@ -102,3 +102,4 @@ class AuthRepository @Inject constructor( } +