👋
Cloud Functions for firebaseを使用して退会機能を追加する
個人アプリに退会機能を追加するためサーバーの構築や保守をしない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をはじめて使用しましたが、思ったより早く完成できてよかったです。
参考記事
Discussion