2년 전 앱 개발할 때 구글 로그인 기능을 구현해 놓은 것이 있어서 그것대로 구현하려고 했으나 google_sign_in 패키지의 메이저 버전이 7로 변경되면서 뭔가 많이 변경된 듯 하다. 그러면서 7.x 버전에는 기존 소스 코드를 적용하는 것이 불가능했다.
예를 들어, GoogleSignIn의 경우 개별 인스턴스를 생성하는 방식이었다면 현재는 싱글턴으로 변경됐다. 게다가 오랫만에 구현이다보니 공식 문서를 보면서 하는데도 계속 예외가 발생해 삽질을 좀 했는데 나중에 또 있을지도 모를 삽질을 방지하기 위해 구현 절차를 기록해 놓으려 한다.
1. 우선 firebase console에서 프로젝트를 생성한다. 나는 android, ios, web 프로젝트를 생성했다. web 프로젝트는 필요없는데 삽질하는 과정에서 생성했다.

2. 제품 카테고리 - 빌드 - Authentication 에서 새 제공업체 추가 버튼을 클릭하며 사용할 로그인 방법들을 추가한다. 나는 일단 MVP를 구현 중이므로 이메일/비밀번호, 구글 로그인만 선택했다.

3. 다음 명령어를 통해 키스토어의 SHA-1 지문을 확인한다.
# 디버그 키스토어의 SHA-1 지문 확인
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
4. 위에서 확인된 SHA-1 지문을 firebase console의 프로젝트 설정 - 일반 탭으로 이동해서 화면 하단에 안드로이드 앱 선택 후 디지털 지문 추가를 클릭해서 SHA-1 지문을 붙여 넣는다.


5. 이제 프로젝트 루트 디렉토리로 이동 후 터미널에서 아래와 같은 절차를 통해 앱에 firebase를 추가하는 절차를 거치면 예전에는 google-services.json과 같은 파일등을 수동으로 다운로드 받아서 복사해 넣어야 했던 것을 자동으로 처리해준다.
# Google 계정으로 Firebase에 로그인
$ firebase login
# FlutterFire CLI가 설치돼 있지 않다면 아래 명령어 설치
$ dart pub global activate flutterfire_cli
# 프로젝트 루트디렉토리로 이동
$ cd <project-root-directory>
# Firebase를 사용하도록 앱 구성
$ flutterfire configure
6. 구글 로그인 코드 작성
// Google 로그인
Future<UserCredential> signInWithGoogle() async {
try {
AppLogger.d('Google 로그인 시도');
// google_sign_in 7.x에서는 instance를 사용해야 함
if (!GoogleSignIn.instance.supportsAuthenticate()) {
throw Exception('Google 로그인을 지원하지 않는 기기입니다');
}
// 초기화 (필요한 경우)
await GoogleSignIn.instance.initialize();
// Google 로그인 플로우 시작
final GoogleSignInAccount googleUser = await GoogleSignIn.instance.authenticate();
AppLogger.d('Google 로그인 성공: ${googleUser.email}');
// 인증 정보 가져오기
final GoogleSignInAuthentication googleAuth = googleUser.authentication;
// idToken 확인 (필수)
final String? idToken = googleAuth.idToken;
if (idToken == null) {
throw Exception('Google 로그인 토큰을 가져올 수 없습니다');
}
// Firebase 인증 자격 증명 생성
// idToken만으로도 Firebase 인증 가능
final credential = firebase_auth.GoogleAuthProvider.credential(
idToken: idToken,
);
// Firebase로 로그인
final userCredential = await _auth.signInWithCredential(credential);
AppLogger.i('Google 로그인: ${userCredential.user?.email}');
return userCredential;
} on GoogleSignInException catch (e) {
// Google 로그인 특정 에러 처리
if (e.code == GoogleSignInExceptionCode.canceled) {
AppLogger.e('Google 로그인이 취소되었습니다. 원인: ${e.toString()}');
// 계정 선택 시 canceled 예외가 발생하는 경우는 보통 설정 문제:
// Firebase 콘솔에 SHA-1 인증서 지문이 등록되지 않았을 수 있음
throw Exception('Google 로그인이 취소되었습니다. Firebase 설정을 확인해주세요.');
}
AppLogger.e('Google 로그인 오류: ${e.code}, 메시지: ${e.toString()}', error: e);
throw Exception('Google 로그인 실패: ${e.toString()}');
} on firebase_auth.FirebaseAuthException catch (e) {
AppLogger.e('Firebase 인증 오류: ${e.code}', error: e);
throw _handleAuthException(e);
} catch (e, stackTrace) {
AppLogger.e('Google 로그인 예상치 못한 오류', error: e, stackTrace: stackTrace);
throw Exception('Google 로그인 실패: $e');
}
}
* 참조 문서
https://firebase.google.com/docs/auth/flutter/federated-auth?hl=ko
제휴 ID 및 소셜 로그인 | Firebase Documentation
의견 보내기 제휴 ID 및 소셜 로그인 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 소셜 인증은 다단계 인증 흐름으로, 사용자를 계정에 로그인 처리하거나
firebase.google.com
https://firebase.google.com/docs/flutter/setup?hl=ko&platform=android
Flutter 앱에 Firebase 추가
의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Flutter 앱에 Firebase 추가 plat_ios plat_android plat_web iOS+ Android 웹 기본 요건 아직 Flutter 앱이 없다면
firebase.google.com