Flutter ํ…Œํฌ

Flutter Web Firebase Auth์—ฐ๋™

๋ฐ๋ถ€์žฅ 2024. 7. 8. 23:08

1. Firebase๊ธฐ๋ณธ์—ฐ๋™์ด ์™„๋ฃŒ๋œ ์ƒํƒœ์—์„œ ํƒญ ๋ฉ”๋‰ด์—์„œ "๋นŒ๋“œ" -> "Authentication"์„ ํƒ

2. ๊ธฐ๋ณธ์ ์ธ "์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ"์„ ํƒ ํ›„ ์‚ฌ์šฉ์„ค์ • ํ›„ ์ €์žฅ ํด๋ฆญ

 

3. Firebase AuthํŒจํ‚ค์ง€ ์„ค์น˜(https://pub.dev/packages/firebase_auth/install)

firebase_auth: ^5.1.1

 

 

4. Flutter ํ”„๋กœ์ ํŠธ์˜ web/index.html ์—ด๊ธฐ

 

5. ํ•˜๋‹จ์˜ <body>ํƒœ๊ทธ ๋ฐ‘์— ์•„๋ž˜์˜ ์Šค๋‹ˆํŽซ ์ถ”๊ฐ€

<!-- Firebase ๊ตฌ์„ฑ ์Šค๋‹ˆํŽซ -->
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-firestore.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-analytics.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-functions.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-messaging.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-storage.js"></script>

 

6. ๋ฐฐํฌ ํ›„ ํ™•์ธ

7. ํ™œ์šฉ ์˜ˆ์‹œ ์ฝ”๋“œ

// ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋ฉ”์ผ ์ „์†ก
Future<List> sendResetPasswordEmail(String email) async {
  try {
    await FirebaseAuth.instance.setLanguageCode("ko");  //์–ธ์–ด ์„ค์ •
    await FirebaseAuth.instance.sendPasswordResetEmail(email: email);
    return [true];
  } catch(e) {
    print('error sendResetPasswordEmail : ${e}');
    return [false, '${e}'];
  }
}

// ๋กœ๊ทธ์ธ ํ•จ์ˆ˜
Future<List> login({required String email, required String password,}) async {
  try {
    try {
      UserCredential _cred = await FirebaseAuth.instance.signInWithEmailAndPassword(
          email: email, password: password);
      //๋กœ๊ทธ์ธ ์„ฑ๊ณต
      return [true, _cred.user?.uid, _cred.user?.email];
    } on FirebaseAuthException catch (e) {
      if (e.code == 'user-not-found') {
        //์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด๋ฉ”์ผ
        return [false, '์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค.'];
      } else if (e.code == 'wrong-password') {
        //๋น„๋ฐ€๋ฒˆํ˜ธ ์˜ค๋ฅ˜
        return [false, '๋น„๋ฐ€๋ฒˆํ˜ธ ์˜ค๋ฅ˜'];
      }
    }
    return [false, '๋กœ๊ทธ์ธ ์‹คํŒจ'];
  } catch(e) {
    print('error login ${e}');
    return [false, '${e}'];
  }
}

// ์ด๋ฉ”์ผ,๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ํšŒ์›๊ฐ€์ž…
Future<List> signUpWithEmail({
  required String email,
  required String password,
  required context,
}) async {
  try {
    UserCredential _cred = await FirebaseAuth.instance.createUserWithEmailAndPassword(
        email: email,
        password: password); //์ด ์ •๋ณด๋กœ ํšŒ์›๊ฐ€์ž…
    //ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต
    return [true, _cred.user?.uid, _cred.user?.email];
  } on FirebaseAuthException catch (e) {
    if (e.code == 'invalid-credential') {
      print('The supplied auth credential is incorrect, malformed or has expired.');
      return [false, '์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช…์ด ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜, ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ฑฐ๋‚˜, ๋งŒ๋ฃŒ๋˜์—ˆ์Œ'];
    } else if (e.code == 'weak-password') {
      //๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณด์•ˆ ๊ฐ•๋„ ๋ฌธ์ œ
      return [false, '๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋ณด์•ˆ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค'];
    } else if (e.code == 'email-already-in-use') {
      //์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฉ”์ผ
      return [false, '์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฉ”์ผ'];
    }
    return [false, e.toString()];
  } catch (e) {
    print('on FirebaseAuthException catch (');
    return [false, e.toString()];
  }
}

// ๋กœ๊ทธ์•„์›ƒ์ฒ˜๋ฆฌ
Future logoutUser() async {
  await FirebaseAuth.instance.signOut();
}