플러터(Flutter) Firebase Authentication 전체 소스 코드입니다. 코드에 대한 설명을 안 보시고 오신 분은 코드 설명을 보고 오시면 코드 구현을 이해하시는데 도움이 됩니다. 또한 Firebase 초기 셋팅을 안 하신 분들은 초기 세팅을 하시고 진행하셔야 됩니다.

(중요) 코드 복사 전 firebase_core, firebase_auth, google_sign_in 플러그인 설치

 

 

 

👇 소스코드 설명 포스팅

 

[Flutter] Firebase Authentication - 이메일 회원가입/로그인, 구글 로그인(firebase_auth, Google_sign_in)

파이어베이스(Firebase)에서는 Authentication 기능을 제공합니다. 이번 포스팅에서 배워볼 것은 이메일 회원가입/로그인 방법과 구글 로그인(구글 시작하기)을 통하여 인증받는 방법을 다뤄보도록 하

cokebi.com

 

👇 Firebase 연동 초기 셋팅 포스팅

 

[Flutter] 플러터 Firebase 연동을 위한 초기 셋팅 방법

모바일 애플리케이션은 서버 연동없이 동작하는 앱도 많이 존재하지만 좀 더 유연한 애플리케이션을 제작하기 위해서는 대부분 서버가 필요합니다. 이번 포스팅에서는 플러터에서 Firebase 연동

cokebi.com

 

소스 코드

- main.dart

import 'package:firebase_setting/login_screen.dart';
import 'package:flutter/material.dart';

import 'firebase_options.dart';
import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  runApp(const MyFirebaseApp());
}

class MyFirebaseApp extends StatelessWidget {
  const MyFirebaseApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LoginScreen(),
    );
  }
}

 

- signup_screen.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_setting/login_screen.dart';
import 'package:flutter/material.dart';

class SignUpScreen extends StatefulWidget {
  const SignUpScreen({super.key});

  @override
  State<SignUpScreen> createState() => _SignUpScreenState();
}

class _SignUpScreenState extends State<SignUpScreen> {
  var _emailInputText = TextEditingController();
  var _passInputText = TextEditingController();

  void dispose() {
    _emailInputText.dispose();
    _passInputText.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: CloseButton(
          onPressed: () => Navigator.pop(context),
        ),
      ),
      body: Padding(
        padding: EdgeInsets.all(8),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 10),
              child: TextField(
                controller: _emailInputText,
                decoration: InputDecoration(hintText: 'Email'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 10),
              child: TextField(
                controller: _passInputText,
                obscureText: true,
                decoration: InputDecoration(hintText: 'Password'),
              ),
            ),
            Container(
              padding: EdgeInsets.symmetric(vertical: 5),
              width: double.infinity,
              child: OutlinedButton(
                onPressed: () async {
                  // 이메일, 비번 중 하나라도 비워있으면 패스
                  if (_emailInputText.text.isEmpty ||
                      _passInputText.text.isEmpty) return;

                  try {
                    await FirebaseAuth.instance.createUserWithEmailAndPassword(
                      email:
                          _emailInputText.text.toLowerCase().trim(), // 가입 이메일
                      password: _passInputText.text.trim(), // 비밀번호
                    );
                    print('success registered');
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => LoginScreen()),
                    );
                  } on FirebaseAuthException catch (e) {
                    print('an error occured $e');
                  }
                },
                child: Text('이메일 회원가입'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

 

 

 

- login_screen.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_setting/home_screen.dart';
import 'package:firebase_setting/signup_screen.dart';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';

class LoginScreen extends StatefulWidget {
  const LoginScreen({super.key});

  @override
  State<LoginScreen> createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  var _emailInputText = TextEditingController();
  var _passInputText = TextEditingController();

  void dispose() {
    _emailInputText.dispose();
    _passInputText.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 10),
              child: TextField(
                controller: _emailInputText,
                decoration: InputDecoration(hintText: 'Email'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 10),
              child: TextField(
                controller: _passInputText,
                obscureText: true,
                decoration: InputDecoration(hintText: 'Password'),
              ),
            ),
            Container(
              padding: EdgeInsets.symmetric(vertical: 5),
              width: double.infinity,
              child: OutlinedButton(
                onPressed: () async {
                  // 이메일, 비번 중 하나라도 비워있으면 패스
                  if (_emailInputText.text.isEmpty ||
                      _passInputText.text.isEmpty) return;

                  try {
                    await FirebaseAuth.instance.signInWithEmailAndPassword(
                      email: _emailInputText.text.toLowerCase().trim(),
                      password: _passInputText.text.trim(),
                    );
                    print('success login');

                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => HomeScreen()),
                    );
                  } on FirebaseAuthException catch (e) {
                    print('an error occured $e');
                  }
                },
                child: Text('이메일 로그인'),
              ),
            ),
            Container(
              padding: EdgeInsets.symmetric(vertical: 5),
              width: double.infinity,
              child: 
              ElevatedButton(
                onPressed: () async {
                  final _googleSignIn = GoogleSignIn();
                  final googleAccount = await _googleSignIn.signIn();

                  if (googleAccount != null) {
                    final googleAuth = await googleAccount.authentication;

                    if (googleAuth.accessToken != null &&
                        googleAuth.idToken != null) {
                      try {
                        await FirebaseAuth.instance
                            .signInWithCredential(GoogleAuthProvider.credential(
                          idToken: googleAuth.idToken,
                          accessToken: googleAuth.accessToken,
                        ));
                        print('success registered');
                        Navigator.push(
                          context,
                          MaterialPageRoute(builder: (context) => HomeScreen()),
                        );
                      } on FirebaseAuthException catch (e) {
                        print('an error occured $e');
                      } catch (e) {
                        print('an error occured $e');
                      }
                    } else
                      print('an error occured');
                  } else
                    print('an error occured');
                },
                child: Text('구글로 시작하기'),
              ),
            ),
            Align(
              alignment: Alignment.centerRight,
              child: TextButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => SignUpScreen()),
                  );
                },
                // width: double.infinity,
                child: Text('회원가입 하러가기'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

 

 

 

- home_screen.dart

import 'package:flutter/material.dart';

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Text('Home Screen')),
    );
  }
}