[안드로이드]구글 Oauth 2.0 로그인 구현 이슈, ApiException 10

Lee Yongin·2024년 5월 22일
1

안드로이드

목록 보기
13/23
post-custom-banner

계정 선택 인텐트 화면까지는 뜨는데 여기서 계정을 선택하면 더 데이터를 얻을 수가 없고 닫힌다

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1641105828, result=0, data=Intent { (has extras) }} to activity 

googleAuthLauncher부분에서 resultCode가 RESULT_CANCELED로 나오는 게 문제이다.

fun requestGoogleLogin(context: Context): GoogleSignInClient {
    val clientId = context.getString(com.hmoa.feature_authentication.R.string.google_cloud_outh_client_id)
    Log.d(
        "feature-authentication",
        "requestGoogleLogin, clientId: ${clientId}"
    )
    val googleSignInOption = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestServerAuthCode(clientId) // string 파일에 저장해둔 client id 를 이용해 server authcode를 요청한다.
        .build()
    Log.d("feature-authentication", "requestGoogleLogin, googleSignInOption: ${googleSignInOption}")
    return GoogleSignIn.getClient(context.findActivity(), googleSignInOption)
}

val googleSignInClient: GoogleSignInClient by lazy { requestGoogleLogin(context) }
val googleAuthLauncher =
        rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                Log.d(
                    "feature-authentication",
                    "result.data : ${result.data?.data}"
                )
                val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
                Log.d(
                    "feature-authentication",
                    "task.givenName: ${task.result.givenName} ,task.serverAuthCode: ${task.result.serverAuthCode}"
                )
                try {
                    val account = task.getResult(ApiException::class.java)

                    // 이름, 이메일 등이 필요하다면 아래와 같이 account를 통해 각 메소드를 불러올 수 있다.
                    val userName = account.givenName
                    val serverAuth = account.serverAuthCode
                    Log.d(
                        "feature-authentication",
                        "googleAuthLauncher success --- userName: ${userName}, serverAuth: ${serverAuth}"
                    )
                    onSignup()

                } catch (e: Exception) {
                    Log.e("feature-authentication", "googleAuthLauncher error: ${e.stackTraceToString()}")
                }
            } else if (result.resultCode == Activity.RESULT_CANCELED) {
                Log.e(
                    "feature-authentication",
                    "result.data : ${result.data?.data ?: "nothing"}, resultCode:${result.resultCode}"
                )
            }
        }
        
   fun handleGoogleLogin() {
	    googleSignInClient.signOut()
	    val signInIntent = googleSignInClient.signInIntent
	    Log.d("feature-authentication", "signInIntent: ${signInIntent}")
	    googleAuthLauncher.launch(signInIntent)
   }

관련 공식문서

??

Exception

설정 오류가 나면 이렇다고 한다…코드는 문제없는 듯

sha-1 debug, release 모두 추가하고 client삭제+ 재생성 → google-service.json 재발급해봄. 그래도 Exception은 같음.

com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 10:

app signing key의 sha-1까지 추가한 다음에도 똑같은 문제가 발생했다.

포기하고 걍 serverAuthCode 요청을 안해도 그렇게 되는지 봤는데

serverAuthCode요청을 안하면 된다..!

뭔가 권한문제인가 싶기도 하다.

일단 공식문서를 정독해보았다.

모바일 및 데스크톱 앱용 OAuth 2.0  |  Authorization  |  Google for Developers

블로그1

[안드로이드/Oauth/Error] Google Oauth2.0 파이어베이스 없이 사용하기 & ApiException 10 에러 해결

블로그2

google login api(oauth2) 에 대한 고찰

어떤 sha-1를 써야되나도 찾아보았는데 debug로 해도되고 배포하고나면 production이기 때문에 release로 바꿔줘야 한다. 근데 지금 우리 프로젝트는 debug상태니까 sha-1 debug를 넣으면 되야 하는데 안된다. 아악

[Android Studio] Google Sign in 삽질.

해결!

아래처럼 파이어베이스에서 로그인 제공업체로 구글을 선택하면 웹 클라이언트가 자동생성된다.

그러면 아래처럼 자동으로 Android, iOS, Web client(auto created by Google Service)가 생긴다.

그리고 requestServerAuthCode()요청을 할 때 인자로 넘겨주는 clientId는 웹 애플리케이션의 클라이언트 ID써야 한다.

val googleSignInOption = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestServerAuthCode(clientId) // string 파일에 저장해둔 client id 를 이용해 server authcode를 요청한다.
        .build()

계속 sha-1 키 오류이거나, 웹 애플리케이션 클라이언트 ID를 쓰는 것이 해결방법으로 나오길래 왜 안되지 싶었는데, 결국 파이어베이스에서 로그인 제공업체를 선택안하고 무턱대고 웹 애플리케이션 클라이언트를 생성하려고 하니 문제였던 것이다.

내 포스팅이 다른 사람들에게도 도움이 되면 좋겠다.

profile
⚡개발자할거야 응애 안드로이드 개발자 ⚡p.s.기록만이 살길이다!
post-custom-banner

0개의 댓글