Skip to content
Open
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
7 changes: 7 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -67,6 +68,11 @@ android {
"NAVER_CLIENT_ID",
"\"${naverClientId.escapeForBuildConfig()}\""
)
buildConfigField(
"String",
"NAVER_CLIENT_SECRET",
"\"${naverClientSecret.escapeForBuildConfig()}\""
)
buildConfigField(
"String",
"NAVER_CLIENT_NAME",
Expand Down Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -28,7 +28,7 @@ class AuthRepository @Inject constructor(
SocialLoginRequest(
provider = GOOGLE_PROVIDER,
code = serverAuthCode,
codeVerifier = null,
codeVerifier = "",
clientType = MOBILE_CLIENT_TYPE
)
)
Expand Down Expand Up @@ -100,3 +100,6 @@ class AuthRepository @Inject constructor(
private const val MOBILE_CLIENT_TYPE = "MOB"
}
}



Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Loading