👋

Cloud Functions for firebaseを使用して退会機能を追加する

2024/09/08に公開

個人アプリに退会機能を追加するためサーバーの構築や保守をしないCloud Functions for firebaseを使用してみました。理由はログインして時間が経つとFirebaseのユーザーを削除する機能が使えなくなり再認証しなければならず、クライアント側の実装が複雑になりそうだったので、Cloud Functionsを使用してみることにしました。

退会機能でやること

  • Firestoreに退会するuidを登録
  • Authenticationにあるユーザー情報の削除
  • Firestoreにあるユーザー情報と履歴を削除

ながれ

①Firestoreに退会するuidをdelete_usersに登録し、それをトリガーにCloud Functionsを経由してAuthenticationにあるユーザー情報とCloudFirestoreの履歴情報の削除
②Authenticationにあるユーザー情報の削除をトリガーにFirestoreにあるユーザー情報を削除

①Firestoreに退会するuidをdelete_usersに登録し、それをトリガーにCloud Functionsを経由してAuthenticationにあるユーザー情報とCloudFirestoreの履歴データの削除

Cloud Functionsは無料枠では使用できないのでBlazeプランに変更しました(どきどき)
こちらの記事を参考にCloud Functionsの設定などを行いました
作成されたindex.jsは以下のようにしました

const functions = require('firebase-functions');
const admin = require('firebase-admin');
// firebase-adminの初期化
admin.initializeApp();
exports.deleteUser = functions
  .region('asia-northeast1') // リージョンの指定
  .firestore.document('deleted_users/{docId}') // トリガーとなるFirestoreのドキュメントパス
  .onCreate(async (snap, context) => {
    const deleteDocument = snap.data(); // ドキュメントデータの取得
    const uid = deleteDocument.uid; // 削除するユーザーのUIDを取得
    try {
    // Firestoreからhabitsデータの削除
      const habitsCollection = admin.firestore().collection('habits');
      // uidとhabitsコレクションのuser_idフィールドが一致するドキュメント取得
      const query = habitsCollection.where('user_id', '==', uid);
      const querySnapshot = await query.get();
      // バッチ作成
      const batch = admin.firestore().batch();
      // 一致するドキュメントを削除
      querySnapshot.forEach(doc => {
        batch.delete(doc.ref);
      });
      await batch.commit();
      // Firebase Authenticationのユーザーを削除
      await admin.auth().deleteUser(uid);
      console.log(`Successfully deleted user with UID: ${uid}`);
    } catch (error) {
      console.error(`Error deleting user with UID: ${uid}`, error);
    }
  });

デプロイしました。成功するとDeploy complete!と出ます。

firebase deploy

②Authenticationにあるユーザー情報の削除をトリガーにFirestoreにあるユーザー情報を削除

Firestoreに保存されているデータを削除するため、Firebaseにある拡張機能Delete User Data Extensionsの登録を行いました。

感想

Cloud Functions for firebaseをはじめて使用しましたが、思ったより早く完成できてよかったです。

参考記事

https://zenn.dev/tama8021/articles/0920_flutter_withdrawal
https://qiita.com/takashikatt/items/e17401ff301b71e821cd
https://www.boel.co.jp/tips/vol124/

Discussion