🦁

【Flutter × Cloud Functions】FirebaseAdminSDKを利用して、ユーザー作成してみる

2023/01/23に公開

初めに

管理者のみが各ユーザーアカウントを発行できる。という機能を実装する為に、FunctionsでFirebaseAdminSDKを利用し、実装したので備忘録として残します。
今回はアカウント発行のみですが、アカウント削除等もできるので管理者機能を実装するには必須っぽい。下記ドキュメントを参考に、今回のコードを少し変えれば削除等も実装できると思います。
https://firebase.google.com/docs/auth/admin/manage-users

◎Functionsの実装

メールアドレスとパスワードをFlutterから受け取り、firebaseAuthenticationにユーザーを登録、登録後にuidを返す関数を実装していきます。
*プロジェクト作成や細かい部分は省きます。こちらを参考にして頂くと良いかと思います

Functionsをプロジェクトに追加

下記コマンドを実行。今回言語はJavaScriptを選択。

firebase init functions

functionsディレクトリが生成されます。

Functionsで関数を実装

functionsディレクトリ内で下記コマンドを実行

yarn add firebase-admin

生成されたfunctionsフォルダ内のindex.js内に下記を実装
今回はfunctions.https.onCallで実装。

const functions = require("firebase-functions");
const admin = require("firebase-admin");

admin.initializeApp();

//ユーザーアカウント作成処理
exports.createUser = functions.https.onCall((data, context) => {
 //パラメータを受け取る
 const email = data.email;
 const password = data.password;
 //デフォルトアプリの認証サービスを取得
 const defaultAuth = admin.auth();
 
 //アカウント作成処理
 return defaultAuth.createUser({
   email: email,
   password: password,
 }).then((userRecord) => {
   //uidを返す
   return {uid: userRecord.uid};
 }).catch((error) => {
   //エラー処理
   throw new functions.https.HttpsError("unknown", error.message, error);
 });
});

関数のデプロイ

下記コマンドを実行
firebase deploy --only functions

◎Flutter側での処理を実装

メールアドレスとパスワードをFunctionsに渡し、Functionsの処理終了後にuidを受け取る処理を実装します。

Functionsを利用する為パッケージをインストール

https://pub.dev/packages/cloud_functions
下記コマンドを実行

flutter pub add cloud_functions

Functionsを呼び出す処理を実装

下記関数を任意の場所で呼び出すことで、実装完了です!

  void createUser(String email,String password) async {
    try {
      //デプロイしたcreateUser関数を実行
      final result = await FirebaseFunctions.instance
          .httpsCallable('createUser')
          .call({'email': email, 'password': password});
      //uidが取れる
      print(result.data);
    } on FirebaseFunctionsException catch (error) {
      //エラー処理
      print(error.code);
      print(error.details);
      print(error.message);
    }
  }

終わりに

Functionsを使わなければ実装できない機能は、ビビっていましたが、臆せず実装していけると実装の幅が広がるなと今回感じました!
(バーと書いたので、何かあったら教えていただけると嬉しいです。)
Twitterでも情報発信しておりますので、ぜひフォローお願い致します!
https://mobile.twitter.com/tatsuki_kt

おまけ HTTPリクエストバージョン

exports.createUser = functions.https.onRequest((request, response) => {
  const email = request.query.email;
  const password = request.query.password;
  const defaultAuth = admin.auth();

  defaultAuth.createUser({
    email: email,
    password: password,
  }).then((userRecord) => {
    console.log("Successfully created new user:", userRecord.uid);
    response.json({uid: userRecord.uid});
  }).catch((error) => {
    console.log("Error creating new user:", error);
    response.json({error: error});
  });
});

エラー

デプロイの際に下記のエラー

i functions: cleaning up build files…

Functionsのディレクトリに移動し、 firebase deploy --only functionsを実行

参考

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

https://github.com/firebase/functions-samples/blob/main/auth-blocking-functions/functions/index.js

権限
https://clubx-engineering.hateblo.jp/entry/220212

Discussion