로그인_버튼_누르면_실패_에러_해결 - boostcampwm-2024/and04-Nature-Album GitHub Wiki

💥 로그인 버튼 누르면 실패 에러 해결

💡 문제 정의

  • 로그인 버튼 누르면 실패해서 로그 찍으면 아래와 같이 보임

image

💡문제 해결 진행

  • 현재 코드에서 인증 과정 순서를 확인하여 이를 해결해보자.

1. 로그인 요청

  • MyPageScreen에서 LoginContent의 버튼을 클릭하면 signInWithGoogle(context) 함수가 호출됨
Button(
    onClick = { signInWithGoogle(context) },
    ...
)
  • 이 버튼 클릭 시 AuthenticationManagersignInWithGoogle(context) 함수가 실행됨

2. Google ID 토큰 요청

  • AuthenticationManager.getCredential(context)에서 Google ID 토큰을 가져온다.
 private suspend fun getCredential(context: Context): Credential {
        val googleIdOption = GetGoogleIdOption.Builder()
            .setFilterByAuthorizedAccounts(false)
            .setServerClientId(BuildConfig.google_web_key) // Firebase Web Client ID
            .setAutoSelectEnabled(true) // 자동 계정 선택 활성화
            .build()

        val request = GetCredentialRequest.Builder()
            .addCredentialOption(googleIdOption)  // Google ID 옵션 추가
            .build()

        val credentialManager = CredentialManager.create(context)

        val result = credentialManager.getCredential(
            context = context,
            request = request
        )  // Google ID 토큰 요청

        return result.credential
    }
  • 성공하면 Credential 객체에 Google ID 토큰이 포함되어 반환
  • 실패하면 AuthResponse.Error를 반환(No credentials available와 같은 에러 발생)

⇒ 이 부분 확인 필요

3. Firebase Credential 생성

  • getFirebaseCredential(credential) 함수에서 Google ID 토큰을 Firebase의 인증 방식에 맞는 AuthCredential로 변환
val googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.data)
val firebaseCredential = GoogleAuthProvider.getCredential(
    googleIdTokenCredential.idToken,
    null
)

4. Firebase 인증 요청

  • Firebase.auth.signInWithCredential(firebaseCredential)을 호출하여 Firebase에 인증 요청
auth.signInWithCredential(firebaseCredential)
    .addOnSuccessListener { 
        getUserToken { authResponse -> trySend(authResponse) }
    }
    .addOnFailureListener { failureResult ->
        trySend(AuthResponse.Error(failureResult.message.toString()))
    }

  • 성공:
    • Firebase 로그인 세션이 생성되고, 사용자의 Firebase ID 토큰을 가져옴
    • AuthResponse.Success를 반환
  • 실패:
    • 에러 메시지와 함께 AuthResponse.Error를 반환

⇒ 이 부분 확인 필요

5. 사용자 정보 관리

  • Firebase의 현재 사용자 정보를 통해 사용자 이메일, 이름, 프로필 사진 등을 UserManager에서 관리
object UserManager {
    private val auth = Firebase.auth

    fun isSignIn() = auth.currentUser != null

    fun getUser(): FirebaseUser? {
        return auth.currentUser
    }
}

💡 Google 계정 선택 창이 표시되지 않는 이유 디버깅

  • AuthResponse.Error: No credentials available라는 메시지가 나타나는 이유 파악하기
    • 해당 부분에 대해서 설마 SHA 키가 나의 키가 아니어서 그런건가?라는 생각을 했다.
    • 점심시간이 끝나서 형준님께 여쭤본 결과 OAuth 2.0 클라이언트 ID가 내 SHA가 아니어서 그런거였다! 역시 담당자에게 물어보는 것이 가장 빠른 길!

💡 추가 클라이언트 ID 해결

  • 이전까지 로그인 관련 작업하시는 분들은 SHA를 넣고 다른 사람은 프로젝트 파서 거기에서 또 SHA 넣어서 진행하셨다고 한다.
  • 그런데 OAuth 2.0 클라이언트 ID를 여러 개 만들 수 있을 것 같아서 관련 문서 정리했다.

OAuth 2.0 클라이언트 ID 생성 관련 안내

  • 이제 SHA로 각자 클라이언트 ID만 생성해두면 따로 프로젝트를 파는 등의 일을 하지 않고 로그인 테스트를 진행할 수 있다.

결과

  • 아래와 같이 로그인이 된다!

image