⛔ 문제사항
Firebase Google Login을 통해 회원가입하는 로직을 구현했으니 이제는 회원탈퇴를 구현하던 때였다. 회원탈퇴 로직을 모두 만들고 테스트할 땐 잘 되다가 다음날 회원탈퇴 버튼을 누르니 제대로 동작하지 않으며
Supplied auth credential is incorrect, malformed or has expired
이와 같은 에러가 발생했다.
나의 단짝친구 Gemini에게도 물어보고 Firebase 공식문서도 참고한 결과, 회원 정보를 삭제하는 것과 같이 민감한 정보를 다룰 때에는 재인증이 필요하다는 것이었다. 로그인 한지 5분이 지나면 이 시간이 경과하여 재인증을 무조건 해야하는 상황이 발생한다.
✅ 해결방안
우선 재인증 하는 로직을 구현한다.
fun reAuthenticateWithGoogle(idToken: String) {
val user = firebaseAuth.currentUser
if (user != null) {
val credential = GoogleAuthProvider.getCredential(idToken, null)
// 재인증 로직
user.reauthenticate(credential)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
// 재인증 성공 후 회원 탈퇴 로직 실행
withdraw(user)
} else {
...
Log.e("reauthenticate", "재인증 실패: ${task.exception}")
}
}
} else {
// user가 null일 경우 실행할 코드 작성
...
}
}
나는 Google Login이기 때문에 GoogleAuthProvider를 사용했지만 만약 다른 Firebase 로그인 방식을 사용하고 있다면 이에 맞게 수정해주면 된다.
재인증에 성공하면 바로 회원탈퇴를 진행시키고 재인증에 실패하면 유저를 강제로 로그아웃 시켜 다시 재로그인하도록 유도하면 끝이다.
이러한 로직을 통해 간단히 reAuthenticateWithGoogle 함수를 실행해주기만 하면 완료이다!
.
.
.
그러나 다음날 갑자기 또 안 되기 시작했다. 로그인한지 5분이 채되지 않았는데도 재인증에 무조건 실패하면서 else 구문을 타지 않아 회원탈퇴를 할 수 없는 상황이 발생한 것이다. 도저히 어떻게 해결해야할지를 몰라서 끙끙 앓던 중에 같은 팀원인 다른 친구가 해결해주었다 ^-^
코드를 통해 알아보자.
// 구글 로그인 클라이언트를 런칭시키는 함수
private fun launchGoogleSignInClient() {
val signInIntent = googleSignInClient.signInIntent
signInLauncher.launch(signInIntent)
}
// 구글 로그인 클라이언트 런처 객체 (registerForActivityResult 사용)
private val signInLauncher: ActivityResultLauncher<Intent> =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
// 사용자가 Google 계정으로 로그인했는지 확인하고, 로그인한 계정의 정보를 얻어옴
val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
try {
val account = task.getResult(ApiException::class.java)
// Firebase에 Google 인증 자격 증명으로 재인증 시도
account?.idToken?.let { idToken ->
myPageViewModel.reAuthenticateWithGoogle(idToken)
}
} catch (e: ApiException) {
Log.e("MyPageFragment", "Google SignIn failed", e)
}
}
}
}
reAuthenticateWithGoogle 함수를 ActivityResultLauncher 안에서 실행해주면 된다.
그리고 getSignedInAccountFromIntent 메소드를 통해 사용자의 구글 계정 로그인 여부와 계정 정보를 가져온다. 사용자가 구글로 로그인 해놓았다면 이 로직은 무리 없이 실행될 것이다! 이 계정에서 idToken값을 가져와 reAuthenticateWithGoogle를 다시 실행하면 재인증이 정상적으로 작동한다.
💡 아니 그럼 ActivityResultLauncher가 뭔데?
ActivityResultLauncher는 액티비티 간의 데이터를 보다 안정적으로 주고 받기 위해 사용된다.
1. Activity의 생명주기를 따르기 때문에 Activity가 파괴될 때 함께 요청을 취소하여 메모리 누수를 방지한다.
2. 필요한 시점에만 메모리를 할당하여 보다 효율적인 메모리 관리가 가능하다.
3. NullPointException으로부터 안전하다.
❗출처
참고 사이트 : https://firebase.google.com/docs/auth/web/manage-users?hl=ko
'Android > 문제해결' 카테고리의 다른 글
문제해결 : 매니페스트 파일에 com.google.android.gms.permission.AD_ID 권한이 포함되어 있습니다. (0) | 2024.09.10 |
---|---|
문제해결 : Error: com.google.android.gms.common.api.ApiException: 10 (4) | 2024.08.31 |
문제해결 : LiveData와 Adapter의 sync 문제 (feat.coroutine) (0) | 2024.08.21 |
문제해결 : Inconsistency detected. Invalid view holder adapter positionHolder (0) | 2024.08.09 |
문제해결 : Unresolved reference: BuildConfig (0) | 2024.08.01 |