Flutter에서 Firebase 인증 시작하기

Firebase에 앱 연결

아직 수행하지 않았으면 Flutter의 Firebase SDK를 설치하고 초기화합니다.

앱에 Firebase 인증 추가

  1. Flutter 프로젝트 루트에서 다음 명령어를 실행하여 플러그인을 설치합니다.

    flutter pub add firebase_auth
    
  2. 완료되면 Flutter 애플리케이션을 다시 빌드합니다.

    flutter run
    
  3. Dart 코드에서 플러그인을 가져옵니다.

    import 'package:firebase_auth/firebase_auth.dart';
    

인증 제공업체를 사용하려면 Firebase Console에서 인증 제공업체를 사용 설정해야 합니다. Firebase 인증 섹션의 로그인 방법 페이지로 이동하여 이메일/비밀번호 로그인과 앱에 사용할 다른 ID 공급업체를 사용 설정합니다.

(선택사항) Firebase 로컬 에뮬레이터 도구 모음으로 프로토타입 제작 및 테스트

앱에서 사용자를 인증하는 방법을 설명하기 전에 인증 기능의 프로토타입을 제작하고 테스트하는 데 사용할 수 있는 도구 모음인 Firebase 로컬 에뮬레이터 도구 모음을 소개하겠습니다. 사용할 인증 기술과 제공업체를 결정하거나, 인증 및 Firebase 보안 규칙을 사용하는 공개 및 비공개 데이터가 포함된 다양한 데이터 모델을 사용해 보거나, 로그인 UI 디자인의 프로토타입을 제작하는 경우 라이브 서비스를 배포하지 않고 로컬에서 작업할 수 있다는 것은 획기적인 아이디어입니다.

인증 에뮬레이터는 로컬 에뮬레이터 도구 모음의 일부이며 앱에서 에뮬레이션된 데이터베이스 콘텐츠와 구성은 물론 필요에 따라 에뮬레이션된 프로젝트 리소스(함수, 기타 데이터베이스, 보안 규칙)와 상호작용할 수 있게 해줍니다.

인증 에뮬레이터를 사용하려면 다음 몇 단계만 거치면 됩니다.

  1. 에뮬레이터에 연결하려면 앱의 테스트 구성에 코드 줄을 추가합니다.

  2. 로컬 프로젝트 디렉터리의 루트에서 firebase emulators:start를 실행합니다.

  3. 대화형 프로토타입 제작에는 로컬 에뮬레이터 도구 모음 UI를, 비대화형 테스트에는 인증 에뮬레이터 REST API를 사용합니다.

  4. useAuthEmulator()를 호출하여 에뮬레이터 주소와 포트를 지정합니다.

    Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    
    // Ideal time to initialize
    await FirebaseAuth.instance.useAuthEmulator('localhost', 9099);
    //...
    }
    

자세한 안내는 인증 에뮬레이터에 앱 연결을 참조하세요. 자세한 내용은 로컬 에뮬레이터 도구 모음 소개를 참조하세요.

이제 사용자 인증 방법을 계속 살펴보겠습니다.

현재 인증 상태 확인

Firebase 인증은 신규 또는 기존 Flutter 애플리케이션에 보안 인증을 통합할 수 있는 다양한 방법과 유틸리티를 제공합니다. 대부분의 경우 사용자의 인증 상태(예: 로그인 또는 로그아웃)를 알아야 합니다.

Firebase 인증을 사용하면 Stream을 통해 이 상태를 실시간으로 구독할 수 있습니다. 호출된 스트림은 사용자의 현재 인증 상태에 대한 즉각적인 이벤트를 제공한 다음 인증 상태가 변경될 때마다 후속 이벤트를 제공합니다.

인증 상태 변경사항을 수신 대기하는 방법에는 세 가지가 있습니다.

authStateChanges()

이러한 변경사항을 구독하려면 FirebaseAuth 인스턴스에서 authStateChanges() 메서드를 호출합니다.

FirebaseAuth.instance
  .authStateChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });

다음 상황이 발생하면 이벤트가 실행됩니다.

  • 리스너가 등록된 직후
  • 사용자가 로그인한 경우
  • 현재 사용자가 로그아웃한 경우

idTokenChanges()

이러한 변경사항을 구독하려면 FirebaseAuth 인스턴스에서 idTokenChanges() 메서드를 호출합니다.

FirebaseAuth.instance
  .idTokenChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });

다음 상황이 발생하면 이벤트가 실행됩니다.

  • 리스너가 등록된 직후
  • 사용자가 로그인한 경우
  • 현재 사용자가 로그아웃한 경우
  • 현재 사용자의 토큰이 변경된 경우

userChanges()

이러한 변경사항을 구독하려면 FirebaseAuth 인스턴스에서 userChanges() 메서드를 호출합니다.

FirebaseAuth.instance
  .userChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });

다음 상황이 발생하면 이벤트가 실행됩니다.

  • 리스너가 등록된 직후
  • 사용자가 로그인한 경우
  • 현재 사용자가 로그아웃한 경우
  • 현재 사용자의 토큰이 변경된 경우
  • FirebaseAuth.instance.currentUser에서 제공하는 다음 메서드가 호출되는 경우:
    • reload()
    • unlink()
    • updateEmail()
    • updatePassword()
    • updatePhoneNumber()
    • updateProfile()

인증 상태 유지

모든 플랫폼용 Firebase SDK는 기본적으로 앱 다시 시작 또는 페이지 새로고침 후 사용자의 인증 상태가 유지되도록 지원합니다.

Android 및 iOS와 같은 네이티브 플랫폼에서는 이 동작의 설정을 변경할 수 없으며 앱을 다시 시작해도 사용자의 인증 상태가 기기에서 유지됩니다. 사용자는 기기 설정을 사용하여 캐시된 앱 데이터를 삭제할 수 있으며, 그러면 저장된 기존 상태가 완전 삭제됩니다.

웹 플랫폼에서 사용자의 인증 상태는 IndexedDB에 저장됩니다. Persistence.LOCAL를 사용하여 로컬 스토리지에 데이터를 저장하도록 지속성을 변경할 수 있습니다. 필요한 경우 이 기본 동작을 변경하여 현재 세션의 인증 상태만 유지하거나 아예 유지하지 않도록 할 수 있습니다. 이러한 설정을 구성하려면 다음 FirebaseAuth.instanceFor(app: Firebase.app(), persistence: Persistence.LOCAL); 메서드를 호출합니다. setPersistence(Persistence.NONE)를 사용하여 각 인증 인스턴스의 지속성을 업데이트할 수 있습니다.

// Disable persistence on web platforms. Must be called on initialization:
final auth = FirebaseAuth.instanceFor(app: Firebase.app(), persistence: Persistence.NONE);
// To change it after initialization, use `setPersistence()`:
await auth.setPersistence(Persistence.LOCAL);

다음 단계

지원되는 ID 및 인증 서비스로 사용자 로그인 및 가입을 처리하는 방법에 대한 가이드를 살펴봅니다.