계정 선택 인텐트 화면까지는 뜨는데 여기서 계정을 선택하면 더 데이터를 얻을 수가 없고 닫힌다
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)
}
관련 공식문서
??
설정 오류가 나면 이렇다고 한다…코드는 문제없는 듯
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를 쓰는 것이 해결방법으로 나오길래 왜 안되지 싶었는데, 결국 파이어베이스에서 로그인 제공업체를 선택안하고 무턱대고 웹 애플리케이션 클라이언트를 생성하려고 하니 문제였던 것이다.
내 포스팅이 다른 사람들에게도 도움이 되면 좋겠다.