UnityでFirebaseを利用したemail/passwordログインを実装する方法

Firebaseを利用することで、Unityでも複数に認証プロバイダを`簡単` に提供できると思って、トライしてみました。結論的にはemail/password認証だけなら簡単だけど、twitterなどの他の認証プロバイダを提供しようとすると、かなり難しいということがわかりました・・・。

ここではまずemail/passwordによる認証方法を実施する手順を紹介しています。
twitterでの認証は次回です。

# 前提
- Unity 2021.3.0f1
  - Firebase sdk 9.6.0

# 手順
1. Unityで認証するプロジェクトを作成します
    1. 今回利用するために新規作成で問題ありません
    2. ただ、iOSの場合バンドルID、Androidの場合パッケージ名などが必要なので、設定しておきます
2. [Firebase プロジェクトを作成します](https://firebase.google.com/docs/unity/setup#create-firebase-project)
3. [アプリを Firebase に登録します](https://firebase.google.com/docs/unity/setup#register-app)
4. [Firebase 構成ファイルを追加します](https://firebase.google.com/docs/unity/setup#add-config-file)
5. FirebaseAuth.unitypackage をインストールします
    1. [https://firebase.google.com/download/unity?hl=ja](https://firebase.google.com/download/unity?hl=ja) からfirebase_unity_sdk_9.6.0.zipをダウンロード（9.6.0はバージョンだと思うので、実施するタイミングで違うと思います）
    2. 解凍するとdotnet4とdotnet3とありますが、3は旧バージョン用に残してあるだけだと思うので、4のほう（firebase_unity_sdk/dotnet4/FirebaseAuth.unitypackage）を使います
6. ユーザ登録用のプログラムを実行します
    1. 以下プログラムをコピペ
        ```csharp
        using UnityEngine;
        using Firebase.Auth;
        
        public class NormalAuthentication : MonoBehaviour
        {
            void Start()
            {
                var email = "demo.user@normal.com";
                var password = "password";
                CreateUserWithEmailAndPassword(email, password);
                // SingIn(email, password);
            }
        
            private void CreateUserWithEmailAndPassword(string email, string password)
            {
                var auth = FirebaseAuth.DefaultInstance;
                auth.CreateUserWithEmailAndPasswordAsync(email, password).ContinueWith(task =>
                {
                    if (task.IsCanceled)
                    {
                        Debug.LogWarning("SignInWithCredentialAsync was canceled.");
                        return;
                    }
        
                    if (task.IsFaulted)
                    {
                        Debug.LogWarning($"SignInWithCredentialAsync was fault. {task.Exception}");
                        return;
                    }
        
                    var newUser = task.Result;
                    Debug.Log($"Firebase上でメールアドレス認証によるユーザ作成に成功しました。 UserId is {newUser.UserId}");
                });
            }
        
            private void SingIn(string email, string password)
            {
                var auth = FirebaseAuth.DefaultInstance;
                auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
                    if (task.IsCanceled) {
                        Debug.LogError("SignInWithEmailAndPasswordAsync was canceled.");
                        return;
                    }
                    if (task.IsFaulted) {
                        Debug.LogError("SignInWithEmailAndPasswordAsync encountered an error: " + task.Exception);
                        return;
                    }
        
                    var newUser = task.Result;
                    Debug.Log($"サインインに成功しました。UserId is {newUser.UserId}");
                });
            }
        }
        ```        
    2. Hierarchy上に空のGameObjectを作って、InspectorからNormalAuthenticationを追加します
    3. 実行してコンソールに `Firebase上でメールアドレス認証によるユーザ作成に成功しました。UserId is zrTwK79hohXxxxxxSxxxxXXjIdh2` と表示されれば成功です。UserIdは架空のものです。
エラー`FirebaseCppApp-9_6_0.bundle”は、開発元を検証できないため開けません。`が出る場合は、[エラー対応](https://qiita.com/drafts/d5cf207c2fb70f726bbd/edit#:~:text=%E3%82%A8%E3%83%A9%E3%83%BC-,%E5%AF%BE%E5%BF%9C,-%E5%AE%9F%E8%A1%8C%E3%81%97%E3%82%88%E3%81%86%E3%81%A8
)を参照ください。
    4. Firebase を確認すると以下のようにユーザが登録されているはずです。![AuthenticationFirebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/4fe87606-b8a3-d33a-1acb-86764e28f323.png)
7. サインインのプログラムを実行します。
    1. 以下のような感じで修正。
        ```csharp
        void Start()
        {
            var email = "demo.user@normal.com";
            var password = "password";
            // CreateUserWithEmailAndPassword(email, password);
            SingIn(email, password);
        }
        ```        
    2. 実行してコンソールに `サインインに成功しました。UserId is zrTwK79hohXxxxxxSxxxxXXjIdh2` と表示されれば成功です。

# エラー対応

## 実行しようとするとbundleが利用できないエラー

### エラー概要
Macで実行しようとすると、`FirebaseCppApp-9_6_0.bundle”は、開発元を検証できないため開けません。`エラーが発生しました。
![スクリーンショット 2022-10-21 22.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/e86795bf-bc35-77d2-d133-dbf38e81b3c4.png)


### 対応方法
「システム環境設定」→「セキュリティとプライバシー」 →「一般」を選択し、下部に出ている「このまま許可」ボタンを押してください。その上で実行すれば、正常に動作するはずです。

# 参考
- Firebaseの[ドキュメント](https://firebase.google.com/docs/auth/unity/start?hl=ja)
- [UnityとFirebaseで出来ること2022](https://zenn.dev/ail/articles/e8decd584be723)