안드로이드/불명예의 전당

[Android/Kotlin/Firebase] Firebase auth - Google 계정으로 로그인 구현 중 Missing Feature{name=auth_api_credentials_begin_sign_in, version=6}해결.

란서 2022. 9. 6. 12:06

제목 그대로 Firebase auth를 통해 - Google 계정으로 로그인을 구현 하고 있었다.

 

https://firebase.google.com/docs/auth/android/google-signin?hl=ko 

 

Android에서 Google에 인증  |  Firebase 인증

2022년 10월 18일에 오프라인과 온라인으로 진행될 Firebase Summit에 참여하세요. Firebase로 앱을 빠르게 개발하고 안심하고 앱을 출시하며 손쉽게 확장하는 방법을 알아보세요. 지금 등록하기 의견 보

firebase.google.com

https://developers.google.com/identity/one-tap/android/get-saved-credentials?hl=ko 

 

저장된 자격 증명으로 사용자 로그인  |  One Tap for Android  |  Google Developers

경고 : 이 데이터는 Google 사용자 데이터 정책에 따라 제공됩니다. 정책을 검토하고 준수하십시오. 그렇게하지 않으면 프로젝트가 정지되거나 계정이 정지 될 수 있습니다. 이 페이지는 Cloud Transl

developers.google.com

 

 

소스코드

 //oneTapClient 초기화 , signInRequest 초기화
    fun setOneTapLogin() {
        oneTapClient = Identity.getSignInClient(requireActivity())
        signInRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    .setServerClientId(BuildConfig.OAUTH_WEB_CLIENT_KEY)
                    .setFilterByAuthorizedAccounts(true)
                    .build())
            .build()

        loginObserver = LoginObserver(this.requireActivity().activityResultRegistry, oneTapClient ,viewModel)
        lifecycle.addObserver(loginObserver)
    }


//Google Login 버튼 클릭 시 sign in 시도.
    fun onGoogleLogin() {
        oneTapClient.beginSignIn(signInRequest).addOnSuccessListener(requireActivity()) { result ->
            try {
                loginObserver.startIntentSenderResult(result)
            }catch (error: IntentSender.SendIntentException) {
                Log.e(TAG,"intentSender Exception : ${error.message}")
            }
        }
            .addOnFailureListener {
                Log.e(TAG,"onGoogleLogin() fail : ${it.message}")
            }
    }

위의 소스코드에서처럼

oneTapClient와 signInRequest를 초기화 하고 

Google Login 버튼을 클릭할 때 oneTapClient를 통해 beginSignIn() 를 통해 sign in 을 실행하려 할 때

 

제대로 sign in 이 이루어지지 않고  다음과 같은 Error를 보여준다.

Missing   Missing Feature{name=auth_api_credentials_begin_sign_in, version=6} 

 

해당 에러를 해결하기 위해 stackoverflow 나 github , 구글 등 검색을 해봤지만 해당 에러에 다룬 제대로 된 포스팅은

stackoverflow의 포스팅에서 나타난다.

https://stackoverflow.com/questions/71325279/missing-featurename-auth-api-credentials-begin-sign-in-version-6

 

Missing Feature{name=auth_api_credentials_begin_sign_in, version=6}

I am trying to use the Google authentication method (One tap sign in) for my application. However, after I clicked on the sign button, I faced the following problems: W/GoogleApiManager: com.google.

stackoverflow.com

 

나와 똑같은 문제를 가진 질문자에게 달린 답변을 통해 문제를 해결하려 했지만 성공하지 못했다.

해당 답변을 보면

 

1. 에뮬레이터 내에서 사용자는 구글 계정에 로그인 되어야 한다.
2. SHA-1 & SHA-256 디버그 해쉬 키가 올바른 project에 등록되어 있어야 한다.
3. 올바른 google-service.json 파일을 올바른 경로에 두어야 한다.
4. 내 project의 web_client_id 를 필요로 되는 메서드(setServerClientId())에 인자로 전달해야 한다.

해당 과정을 모두 올바르게 구현하고 에뮬레이터가 아닌 실제 디바이스에서 실행을 해본다.

 

위의 모든 과정을 서너번 확인하고 실행했음에도 불구하고  실행이 되지 않았고,

위의 답변에서도 만약 실제 디바이스에서도 실행이 되지 않는다면 도움을 줄 수 없다는 답변을

해주었기 때문에 결국 다른 방법을 찾아봐야만 했다.

 

 

해결

더 이상 검색결과를 통해 얻을 수 있는 정보가 없다고 판단되어 다시 한번 공식문서를 살펴보기 시작했다.

그러던 중 signInRequest를 초기화할 때 내가 구현한 코드와는 다른 코드를 발견할 수 있었다.

 

        signInRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    .setServerClientId(BuildConfig.OAUTH_WEB_CLIENT_KEY)
                    .setFilterByAuthorizedAccounts(true)
                    .build())
            .setAutoSelectEnabled(true) /// <= 이부분
            .build()

.setAutoSelectEnabled(true) 라는 코드를 Firebase docs에서는 발견하지 못했는데, Google의 https://developers.google.com/identity/one-tap/android/get-saved-credentials?hl=ko 에서는 사용하고 있는 것을 보고

내 코드에 또한 적용해봤더니 error가 발생하지 않고 성공적으로 sign in 할 수 있었다..

 

 

하지만 해당 코드가 어떤 영향을 미쳤는지.. 왜 오류가 해결됐는지는 아직 모르겠어서

해당 글을 '카테고리/불명예의 전당' 에  포스팅한다.ㅠ