로그인_버튼_누르면_실패_에러_해결 - boostcampwm-2024/and04-Nature-Album GitHub Wiki
💥 로그인 버튼 누르면 실패 에러 해결
💡 문제 정의
- 로그인 버튼 누르면 실패해서 로그 찍으면 아래와 같이 보임
💡문제 해결 진행
- 현재 코드에서 인증 과정 순서를 확인하여 이를 해결해보자.
1. 로그인 요청
MyPageScreen
에서LoginContent
의 버튼을 클릭하면signInWithGoogle(context)
함수가 호출됨
Button(
onClick = { signInWithGoogle(context) },
...
)
- 이 버튼 클릭 시
AuthenticationManager
의signInWithGoogle(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를 여러 개 만들 수 있을 것 같아서 관련 문서 정리했다.
- 이제 SHA로 각자 클라이언트 ID만 생성해두면 따로 프로젝트를 파는 등의 일을 하지 않고 로그인 테스트를 진행할 수 있다.
결과
- 아래와 같이 로그인이 된다!