📘

【Flutter】退会機能を追加したい

2021/09/20に公開1

概要

下記のようなツイートを拝見したので今作っているFlutter ✕ Firebaseのアプリに退会機能を追加しようということで実際に試してできたやり方や参考になった記事について書いていきたいと思います。

https://twitter.com/_mono/status/1404977392641200128

こちらの記事の手順を参考に実装した方法をまとめました。

https://qiita.com/takashikatt/items/e17401ff301b71e821cd

はじめに

退会機能の処理としては下記の3つの処理をすることで実装していきます。

  • Authenticationで管理しているユーザーの情報を削除
  • そのユーザーと紐付いているFirestore(DB)に保存しているユーザデータも削除
  • どのユーザーが削除されたのかという履歴を残す

Firebaseでは上記の実装の方法が2つあります。

  • クライアント側から削除する
  • Cloud Functionsで削時間が

しかしクライアント側での削除は前回のアカウント連携から時間が経過しているとエラーになるため今回はCloud Functionsの方でやっていきたいと思います。

参考

退会機能実装の流れ

  1. 削除するユーザーのUIDをFirestoreに登録
  2. Firestoreに登録時をトリガーとしてCloud Functionsを経由してAuthenticationのユーザーを削除する
  3. Authenticationのユーザー削除をトリガーとしてCloud Functions経由でFirestoreに登録されているユーザーのデータを削除する

1. 削除するユーザーのUIDをFirestoreに登録

deleted_usersというコレクションにデータを登録していきます。

ElevatedButton(
            onPressed: () async {
              final data = {
                "uid": user.uid,
                "createdAt": Timestamp.now(),
              };
              await FirebaseFirestore.instance
                  .collection('delete_users')
                  .add(data)
                  .then((value) async => {
                        await FirebaseAuth.instance.signOut(),
                        Navigator.of(context).pushReplacement(
                            MaterialPageRoute(builder: (context) {
                          return LoginPage();
                        }))
                      })
                  .catchError((e) => print("Failed to add user: $e"));
            },
            child: Text('退会する'),
          )

2.Firestoreに登録時をトリガーとしてCloud Functionsを経由してAuthenticationのユーザーを削除する

Cloud Functionsの方にAuthenticationのユーザーを削除する関数をデプロイしていきます。
僕自身今回始めてCloud Functionsを使うということでこの記事を参考に進めました。

こちらの記事も参考にさせてもらいました。

コードの内容としてはとても単純でドキュメント追加時のonCreateの実行時にAuthenticationのユーザーを削除する感じです。

index.js
import functions = require("firebase-functions");
import admin = require("firebase-admin");

// firebase-adminの初期化
admin.initializeApp();

exports.deleteUser = functions
    .region("asia-northeast1")
    .firestore.document("deleted_users/{docId}")
    .onCreate(async (snap, context) => {
      const deleteDocument = snap.data();
      const uid = deleteDocument.uid;

      // Authenticationのユーザーを削除する
      await admin.auth().deleteUser(uid);
    });

3.Authenticationのユーザー削除をトリガーとしてCloud Functions経由でFirestoreに登録されているユーザーのデータを削除する

Firestoreに保存されているデータを削除するのにはFirebase側が提供している Delete User Data Extensionsを使います。

https://firebase.google.com/products/extensions/delete-user-data

コンソールでインストールするをクリック後、入力項目があるのでご自身のプロダクトを見てUIDに紐づくユーザーコレクションのパスを入力するなどして登録します。

画像は登録後の画面です。参考程度に、、

まとめ

Firebase Authentication、Firestoreのユーザデータを削除する退会機能をまとめてみました。
最初はCloud functionsを使ったことがなかったので不安だったんですけど、案外あっという間に実装することができたので、是非試してみてください。

またこの実装で上手くいかなかったり、間違っている箇所があればコメント等で教えて下さい!

参考

https://qiita.com/takashikatt/items/e17401ff301b71e821cd

https://firebase.google.com/docs/functions/get-started?hl=ja

https://firebase.google.com/products/extensions/delete-user-data

GitHubで編集を提案

Discussion

JboyHashimotoJboyHashimoto

tama8021さん、最近Cloud Functionsの勉強を始めたのですが、退会機能を作る参考になりました!
有益な情報を提供していただきありがとうございました!