질문 정리

안드로이드 컴포즈 구글 로그인 연동 정리

five2week 2024. 4. 28. 19:15

1. Google Service 추가

프로젝트의 build.gradle 파일에 Google 서비스 플러그인과 Google 로그인 라이브러리를 추가해야합니다.

// Project-level build.gradle
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    
    id("com.google.gms.google-services")
}

dependencies {
	  //firebase
    implementation(platform("com.google.firebase:firebase-bom:32.7.0"))
    implementation("com.google.firebase:firebase-analytics")
    implementation("com.google.firebase:firebase-analytics-ktx")
    implementation("com.google.firebase:firebase-crashlytics")
    implementation("com.google.firebase:firebase-auth-ktx")
    implementation("com.google.android.gms:play-services-auth:20.7.0")
}
// App-level build.gradle
plugins {
    id("com.android.application") version "8.1.1" apply false
    id("org.jetbrains.kotlin.android") version "1.8.10" apply false

    id("com.google.gms.google-services") version "4.4.0" apply false
}

2. Google API Console 프로젝트 설정

  1. Google API Console에 접속하여 프로젝트를 선택하거나 새 프로젝트를 생성합니다.
  2. "OAuth 2.0 클라이언트 ID"를 생성합니다. 이 과정에서 Android 애플리케이션의 패키지 이름과 SHA-1 인증서 지문이 필요합니다.
    1. 안드로이드에서 SHA-1 생성법
      1. shift 두번 누른 후, gradle task 검색하면 나오는 “Excute Gradle Task” 선택
      2. gradle signingReport라고 검색
      3. SHA1이라고 적힌 키 복사
  3. 생성된 클라이언트 ID를 google-services.json 파일로 프로젝트의 app/ 디렉토리에 추가합니다.

3. Compose UI에서 Google 로그인 버튼 구현

주의 : Android Client Key가 아니라 Web Client Key를 사용해야합니다.

@Composable
fun GoogleLoginElement(modifier: Modifier = Modifier) {
    val context = LocalContext.current
    val viewModel: LoginFormViewModel = hiltViewModel()
    val launcher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.StartActivityForResult()
    ) {
        viewModel.loginGoogle(activityResult = it)
    }

    Row(
        modifier = modifier
            .wrapContentWidth()
    ) {
        ImageButton(R.drawable.google_icon, "Google") {
            val googleSignInOptions = GoogleSignInOptions
                .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken("your_web_client_key")
                .requestEmail()
                .build()

            val googleSignInClient = GoogleSignIn.getClient(context, googleSignInOptions)
            launcher.launch(googleSignInClient.signInIntent)
        }
    }
}
fun loginGoogle(
    activityResult: ActivityResult
) {
    val task = GoogleSignIn.getSignedInAccountFromIntent(activityResult.data)
    task.addOnCompleteListener { completedTask ->
        try {
            val account = completedTask.getResult(ApiException::class.java)

            val idToken = account.idToken
            if (idToken != null) {
                performLoginSocial(SignUpType.GOOGLE, idToken, "")
            } else {
                LogUtils.e("Google ID Token is null")
            }
        } catch (e: ApiException) {
            LogUtils.e("Google sign in failed: ${e.statusCode} ${e.status}")
            LogUtils.e(e.printStackTrace().toString())
        }
    }
}