Firebaseアプリのアカウント管理ツール

記事
IT・テクノロジー

Firebaseアプリのアカウント管理ツール

Firebaseアプリを作っていると、アプリの管理ツールが欲しくなることが結構あります。 開発中は大抵の事はFirebaseコンソールでできるので余り不便は感じません。しかし、実際にWebサービスやWebアプリを運用し始めると、開発者以外の人が、アプリの管理をする場合も多く、専用の管理ツールが欲しくなる場合があります。
この記事では、管理ツールの中の特にアカウント管理ツールを取り上げてみました。

Firebaseのログイン機能を使う場合必要になるアカウント管理

Firebaseの機能のうちログイン機能(ユーザー認証機能)は特定の人にサービスやアプリを提供したい場合には便利な機能です。必要な機能はほぼサポートされているので、WebサービスやWebアプリを実装するのにとても利用価値の高い機能です。
ログイン機能を使う場合、当然ですがアカウントの管理が必要になります。 Firebaseのログイン機能を利用してReactでログインを実装する記事は以前に紹介しています。
この記事では、希望の利用者に自分自身でサインアップ(登録)をしてもらうという方法を採用しています。この場合は、特に管理ツールがなくても余り運用上は問題がありません。アカウントの作成、E-Mailの確認、パスワードのリセットを利用者自身が行ってくれるので、特に問題が起きない限りは余り管理者の作業は必要ありません。
ところが、管理者がアカウントを作成してサービスを提供する場合には話が違ってきます。
例えばグループ毎に違うデータをFirebaseで管理している場合です。 具体的な例としては、オンラインクラスルームのような作業をする場合です。もちろん、利用者がサインアップする方式でも運用はできます。しかし、管理側で必要なアカウントを作ったり、グループごとに管理者を置いたりする場合は、管理用のアプリがあった方が便利ですし、運営もスムーズに行うことが可能になります。
オンラインスクールなどのシステム案件を手がける場合には、このような管理機能は要求項目に入っている場合がほとんどです。

通常のフロントエンドからのアクセスの限界

ある程度の機能は通常のフロントエンドからでも実現は可能です。例えば、E-Mailを使ったアカウントを作成するだけならば特に問題なく作れます。ただ少し面倒なことは、フロンエンドからのアクセス(通常のクライアント用のSDK)を使ってアカウントを作成する場合は、以下のようなコードを書けば実現できます。
firebase.auth().createUserWidthEmailAndPassword(email,password).then(() -> {
    // ユーザーアカウントの作成成功
    // 作成したユーザーでのログイン状態になります
}).catch((error:any) => {
    // ユーザーアカウントの作成失敗
})
問題は、作成に成功した後は、作成したユーザーでログイン状態になります。 例えば、管理用の特別なユーザーアカウントを作成して管理者として作業していた場合でも、この方法でアカウントを作成すると、作成後は作成したユーザーでログイン状態になるため、管理者の特権(例えば、全てのデータベースのコレクションやドキュメントのアクセス)を通常は持たない状態になります。従って、必要なデータベースの設定を行う場合は一旦、作成したユーザーのアカウントからログアウトして、管理者として再度ログインする必要があります。
ちょっと不便ですよね?この方法だと、Firebaseコンソールで作業するのと余り大差がなくなってしまう場合が多くなります。特に、Firebaseのuidを取得したい場合などは面倒です。そう考えるとFirebaseコンソールで作業した方が早い場合が多くなってしまいます。

Firebase admin SDKを使う

そのために、提供されているのが「Firebase admin SDK」です。 Firebase admin SDKを使えば、管理者として自由にアカウントの作成、データベースの設定が行えます。必要ならば、uidの設定も可能です。
import admin from "firebase-admin"
....
const firebaseApp:admin.app.App = firebase.initializeApp({
    credential: firebase.credential.cert(
      path.join(__dirname,"../serviceAccountKey.json"),
    databaseURL: "https://xxxxx-xxxxxx-xxxxx.firebaseio.com",
  });
firebaseApp.auth().createUser({
    email: email,
    password: password,
}).then((record: firebase.auth.UserRecord) => {
    // カスタムユーザーコレクションに登録
    firebaseApp.firestore().collection(CONSTANTS.FB_COLLECTION_USERS)
    .doc(recorduid).
    .set({
        email: record.email,
        uid: record.uid,
        gid: req.body.group,
        type: req.body.type,
    })
    .then(() => {
        // ユーザー作成成功(カスタムユーザーコレクションの登録も成功)
    }).catch((error:any) => {
        // データベースへのカスタムユーザーコレクションの登録失敗
    });
}).catch((error:any) => {
    // ユーザの作成に失敗
});
このように、Firebaseのユーザー認証では含まれていないgidのようなグループIDを含めて管理する場合にはFirebase Cloud Firestoreにカスタムのユーザーコレクションを作成して別に管理する必要があります。こうした場合、アカウントを作成してそのままuidを取得してカスタムのコレクションに登録することが可能になります。

Firebase admin SDKはNode.jsで実行!

ここで混乱しやすいのが、Firebase admin SDKがどこで実行されているかです。 見た目はTypescript(Javascript)のコードです。しかし、このコード自身は通常のフロントエンドのコードとは違って、Webブラウザーで実行されていません。
基本的に「Node.js」の実行環境で動作します。つまりブラウザーの外で動くというわけです。
このあたりが、同じ「Javascript」で書かれているので混乱しやすい点です。
シンプルな管理アプリの場合、コマンドラインで実行するスクリプトで実現することも可能ですが、UIを使いたい場合は、実行するPCにローカルのサーバーを立てて簡易WebアプリケーションとしてWebブラウザを利用したUIを作成して利用する場合が多くなります。
すでにこの連載でも紹介している「express」などを利用して、アプリを実装する場合が多いようです。少し複雑なアプリの場合は、NEXTやNUXTといったサーバーサイドのフレームワークを使うとより複雑なUIの構築も可能になります。

Firebase admin SDKを利用するメリット

管理ツールの実装方法は実際にWebサーバーにバックエンドのサービスとしてFirebaseのファンクション(functions)を使って実装する方法もあります。その場合は、インターネット上に公開されているので、当然ですが、ユーザーの認証を行うなどして、アクセスを制限する必要があります。
もう一つは、インターネットには公開せずに管理用のPCから起動できるようにして、専用のPCから操作する方法です。この場合は、管理アプリ自体はインターネットに公開されていないので、管理用のPCをきちんと管理運営すれば、第三者が不正に管理アプリを利用するリスクは圧倒的に低くなります。これはセキュリティ上は大きなメリットになります。
もう一つ大きなメリットは、セキュリティルールの設定です。 フロントエンドから管理を行うためには、管理を行うためのアカウントを作成して、セキュリティルールで「特権」を与えるというのが一つの方法です。 当然、ユーザー認証を経ないと、特権を利用できませんが、パスワードが盗まれたりした場合は、意図しない不正アクセスの可能性は残ります。
Firebase admin SDKを利用する場合は、不要なフロントエンドからのアクセスをすべて禁止にすることが可能なので、より強固なセキュリティルールの設定も可能になります。

まとめ

Firebaseに限らず、WebサービスやWebアプリを開発・運営する場合、管理用のアプリが必要になる場合がたくさんあります。Firebaseの場合Firebaseコンソールがその役割を担うことも可能です。しかし、専用の管理アプリがあると運営上かなり便利になる場合がたくさんあります。
管理アプリをFirebase admin SDKを利用して開発すると、通常のフロントエンドを利用した管理アプリを使う場合より使う場合より強固なセキュリティ対策が可能になります。 セキュリティ対策の基本は不必要なアクセスを極力減らすことにあります。フロントエンドから全て管理できるのは便利な面もありますが、セキュリティ上は、管理は専用の管理PCで動作する管理プリに限定することでより強固なものにできます。
Firebaseを利用する場合、通常のアプリ開発だけではなく、Firebase admin SDKも導入してより運用しやすく、セキュリティ上も強固なアプリを利用できると、利用者に最高のアプリやサービスを提供することができます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す