📱

Flutter:FirebaseのAuthenticationでメール・パスワード認証をする

2024/05/12に公開

前提

  • flutterアプリにfirebaseの設定が登録済みになっている.
  • flutterでモバイルアプリを作成しようとしている.

使い方

firebase_authのインストール

$ flutter pub add firebase_auth

firebaseのAuthenticationページにアクセスする.

ここで,ネイティブのプロバイダの「メール/パスワード」の認証設定を有効にする.

flutterコード設定

  • 下記のようなコードを作成すれば良い.

  • login_page.dart

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:gap/gap.dart';

import 'home_page.dart';
import '../ui_settings/ui_colors.dart';
import "../ui_settings/ui_button.dart";

class LoginPage extends StatefulWidget {
  const LoginPage({Key? key}) : super(key: key);

  
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  String _email = '';
  String _password = '';
  String message = '';
  String infoMessage = '';
  bool isError = false;
  final String title = "Login Page"; 

  void set_infoMessage(message) {
    setState(() {
      infoMessage = message;
    });
  }

  void set_isError({boolean = true}) {
    setState(() {
      isError = boolean;
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
        backgroundColor: CommonColors.primaryColor,
      ),
      backgroundColor: Colors.white,
      body: Center(
        child: Container(
          padding: const EdgeInsets.all(24),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              // エラーメッセージ表示
              Container(
                padding: const EdgeInsets.all(10),
                decoration: infoMessage == ""
                    ? null
                    : BoxDecoration(
                        color: CommonColors.primaryColor,
                        border: Border.all(width: 0)),
                child: Text(
                    isError ? "エラーが発生しました:\n $infoMessage" : infoMessage,
                    style: const TextStyle(color: Colors.black)),
              ),
              const Gap(30),
              // メールアドレス入力欄
              TextFormField(
                decoration: const InputDecoration(labelText: 'メールアドレス'),
                onChanged: (String value) {
                  setState(() {
                    _email = value;
                  });
                },
              ),
              // パスワード入力欄
              TextFormField(
                decoration: const InputDecoration(labelText: 'パスワード'),
                obscureText: true,
                onChanged: (String value) {
                  setState(() {
                    _password = value;
                  });
                },
              ),
              const Gap(50),
              // ユーザ登録(サインアップ)ボタン
              ElevatedButton(
                style: AuthButton.style,
                child: const Text('ユーザ登録(サインアップ)'),
                onPressed: () async {
                  try {
                    final User? user = (await FirebaseAuth.instance
                            .createUserWithEmailAndPassword(
                                email: _email, password: _password))
                        .user;
                    if (user != null) {
                      print("ユーザ登録しました:\n ${user.email} , ${user.uid}");
                      // ユーザ登録に成功したので,ホーム画面に遷移する.
                      await Navigator.of(context).pushReplacement(
                        MaterialPageRoute(builder: (context) {
                          return HomePage(user);
                        }),
                      );
                    }
                  } on FirebaseAuthException catch (error) {
                    set_isError(boolean: true);
                    set_infoMessage(error.message.toString());
                  }
                },
              ),
              // ログインボタン
              ElevatedButton(
                  style: AuthButton.style,
                  child: const Text('ログイン'),
                  onPressed: () async {
                    try {
                      // メール/パスワードでログイン
                      final User? user = (await FirebaseAuth.instance
                              .signInWithEmailAndPassword(
                                  email: _email, password: _password))
                          .user;
                      if (user != null) {
                        print("ログインしました:\n ${user.email} , ${user.uid}");
                        // ログイン成功したので,ホーム画面に遷移.
                        await Navigator.of(context).pushReplacement(
                          MaterialPageRoute(builder: (context) {
                            return HomePage(user);
                          }),
                        );
                      }
                    } on FirebaseAuthException catch (error) {
                      set_isError(boolean: true);
                      set_infoMessage(error.message.toString());
                    }
                  }),
              // パスワードリセットボタン
              ElevatedButton(
                  style: AuthButton.style,
                  child: const Text('パスワードリセット'),
                  onPressed: () async {
                    try {
                      await FirebaseAuth.instance
                          .sendPasswordResetEmail(email: _email);
                      message = "パスワードリセット用のメールを送信しました";
                      set_isError(boolean: false);
                    } on FirebaseAuthException catch (error) {
                      message = error.message.toString();
                      set_isError(boolean: true);
                    }
                    set_infoMessage(message);
                  }),
            ],
          ),
        ),
      ),
    );
  }
}


      

参考

https://pub.dev/packages/firebase_auth

https://www.flutter-study.dev/firebase-app/firestore

https://zenn.dev/kazutxt/books/flutter_practice_introduction/viewer/30_chapter4_authentication

https://firebase.google.com/docs/auth/flutter/manage-users?hl=ja

Discussion