👏

[2025年]Unity Editor でも Firebase 使いたい(Auth編)

に公開

Firebase は、アプリの裏側で動く「サーバーの代わり」を Google が用意してくれるサービスです。ログイン機能やデータの保存、画像の保管、通知の送信など、アプリを作るときによく必要になる仕組みをまとめて提供してくれます。自分でサーバーを作らなくても使えるので、初心者でもアプリ開発を始めやすくなります。

でも、Firebase 使ってみたいけど、Android や iOS 端末用意しないと使えないのか……。

こんな風に思っている人、多いと思いますし、いくつかのサイトではそう断定されていました。
本当にそうだとしたら Unity 開発中は Firebase に一切アクセスできず、不便を強いられてしまいますよね。

そこで、本当に使えないのか調査してみました。
結論から言うと「使えるようです」。

Firebase の開発者は「iOS、Android 以外正式対応はしていない」とアナウンスしているのですが、これはおそらく Firebase の全ての機能が使えるわけではない、といったニュアンスだと思われます。

ログイン機能(FirebaseAuth)や、データベース(Firestore)などは Unity Editor からアクセスできましたので、まずは FirebaseAuth で正しくログイン制御ができるようになるまでの手順を残しておきます。

Firebase にプロジェクトを作成


Firebase(https://firebase.google.com/?hl=ja) にアクセスし、ログインします。
はじめてであればサインアップ(ユーザーを作成)してください。

ログインしたら、Get Started in Console

最小構成にするため、全ての機能をオフにしましたが必要に応じてオンにしてください。

Unity の設定、インポート


プロジェクトを作成したら、画面左上の歯車マーク > プロジェクトの設定


unity のアイコンをクリック。


最終的には iOS、Android にも対応したいので、両方登録。
MyCompany には自分の会社名 or チーム名、AppName にはアプリの名前を入れましょう。
入力し終わったら登録


2つのファイル(google-services.jsonGoogleService-Info.plist)をダウンロードし、Assets/ 直下に入れてください。
(厳密には他の場所でもよさそうですが、よくわからない場合は直下が安全です)

終わったら次へ


Firebase Unity SDK をダウンロードします。中にはたくさん unitypackage が入っています。


ログインに必要なのは FirebaseAuth.unitypackage ですので、Unity のプロジェクトにインポートしてください。

Auth(ログイン機能)をオン


基本となるメールパスワードによるログインを許可します。
これを許可しないとサインアップやログインが出来ないので注意しましょう。

Unity からログイン

Sample を GameObject にアタッチし、実行してください。

Sample.cs
using UnityEngine;

public class Sample : MonoBehaviour
{
    async void Start()
    {
        await FireBaseTest.Create();
        await FireBaseTest.SignUpOrLogin("sample@email.com", "password");
    }
}
FireBaseTest.cs
using UnityEngine;
using Firebase;
using Firebase.Auth;
using System.Threading.Tasks;
using System;

public partial class FireBaseTest
{
    static FirebaseAuth auth;

    static void log(string message)
    {
        Debug.Log($"[FireBaseTest] {message}");
    }

    static void logError(string message)
    {
        Debug.LogError($"[FireBaseTest] {message}");
    }

    /// <summary>
    /// 初期化
    /// </summary>
    public static async Task Create()
    {
        try
        {
            var status = await FirebaseApp.CheckAndFixDependenciesAsync();

            if (status == DependencyStatus.Available)
            {
                log("Firebase 初期化完了");

                auth = FirebaseAuth.DefaultInstance;
            }
            else
            {
                logError($"Firebase 初期化エラー: {status}");
            }
        }
        catch (Exception ex)
        {
            logError("Firebase 初期化中に例外発生: " + ex);
        }
    }

    /// <summary>
    /// サインアップ. 既にユーザーが存在する場合はログイン
    /// </summary>
    public static async Task SignUpOrLogin(string email, string password)
    {
        try
        {
            var newUser = await auth.CreateUserWithEmailAndPasswordAsync(email, password);

            log($"ユーザー作成成功: {newUser.User.Email}, UID: {newUser.User.UserId}");
        }
        catch (FirebaseException ex)
        {
            var errorCode = (AuthError)ex.ErrorCode;

            if (errorCode == AuthError.EmailAlreadyInUse)
            {
                log("メールアドレスは既に使用されています。ログインを試みます。");
                try
                {
                    var signInResult = await auth.SignInWithEmailAndPasswordAsync(email, password);

                    log($"ログイン成功: {signInResult.User.Email}, UID: {signInResult.User.UserId}");
                }
                catch (FirebaseException loginEx)
                {
                    log("ログイン失敗: " + loginEx.Message);
                }
            }
            else
            {
                logError("ユーザー作成失敗: " + ex.Message);
            }
        }
    }
}

SignUpOrLogin は「データベースにユーザーがいればログイン、いなければサインアップ(ユーザー作成)」を行うメソッドです。これ1つでサインアップとログインが出来る横着関数ですが、別々にしたほうがいいかもしれません。

実行すると、このようなコンソールログが出力されます。
Auth だけなので、Database の警告は問題ありません。

なお、Firebaseでは匿名ユーザーの利用も可能です。
ハイスコアランキングのために、いちいちメールとパスワード登録はしませんよね。そういった場合は匿名ユーザーとして、アプリ内で情報を隠蔽するのが適切でしょう。

Firebase でユーザーを確認する


Authentication に先ほどサインアップで作成されたユーザーが表示されています。


まれに生成されず、アクセスエラーになることもありますが、その場合一旦再生を中止し、もう一度再生してください。

Unity Editor で実行されるカラクリ

初回実行時、(おそらく)アンドロイドの情報を元に Assets/StreamingAssets/google-services-desktop.json というファイルが生成されます。中身は同じです。

これを消すとアクセスに失敗しますが、再生中止時に「なければ毎回作っている」ような気がします。

Firebase のリスク

最後に、Firebase のリスクについても触れておきます。

たとえば google-services-desktop.json ですが、Windows ビルドすると平文のまま StreamingAssets の中に存在してしまいます。

この情報を使って、個人で制作した別アプリから無限にアクセスできてしまいます

ただ、漏洩しても問題にならないアプリ作りは可能です。
具体的に言うと、Firestore はアプリ内からデータを書き換え禁止にして、Cloud Functions を使ってサーバー側で処理する、AppCheck を使ってアクセスが対象アプリであることを保証する(Android、iOS、Web 限定)、等です。

テスト段階であれば、セキュリティガチガチの制作は難易度が高い(面倒が多い)ので、まずはアクセスルールをゆるゆるにし、なんでもかんでもアプリ側で実装してみるというのもアリかもしれません。
また、ほとんどの個人製作アプリは数名~多くても百名くらいに使われれば御の字ですし、過疎ってるアプリを解析し、悪事を働かれる可能性はそれほど大きくないと判断……出来なくもないかな……?

❗Firebase 利用におけるセキュリティとコスト

いずれにせよ、Firebase はレンタルサーバーのような月額もなければ無料枠も非常に大きく便利ですが、それを超えれば従量課金制です。
悪意のある第三者や、自分の設計の甘さによって急に Google から何十万、何百万もの支払いを要求される可能性がゼロではないことには注意してください。

Discussion