カスタム認証システムと Unity を使用して Firebase 認証を行う

ユーザーがログインに成功したときに署名済みのカスタム トークンが生成されるように認証サーバーを変更することで、Firebase Authentication をカスタム認証システムと統合できます。アプリはこのトークンを受信して、Firebase での認証に使用します。

準備

    Firebase Authentication を使用するには、その前に Firebase プロジェクトを作成して、Firebase Unity SDK パッケージを Unity プロジェクトに追加する必要があります。

    設定:

    事前準備

    Android

    • Unity 5.0 以降
    • Android NDK バージョン 10d 以降

    iOS

    • Unity 5.0 以降
    • Xcode 8.0 以降

    Unity プロジェクトをまだ用意していない場合は、いずれかのクイックスタート サンプルをダウンロードし、特定の Firebase 機能をお試しいただけます。クイックスタートを使用する場合は、次のステップでバンドル識別子が必要になるため、プロジェクト設定からバンドル識別子を忘れずに取得してください。

    Firebase コンソールでアプリを設定する

    アプリに Firebase を追加するには、Firebase プロジェクトと、アプリ用の Firebase 構成ファイルが必要です。

    Firebase プロジェクトを作成するには:

    1. Firebase プロジェクトをまだ用意していない場合は、Firebase コンソールで Firebase プロジェクトを作成します。[プロジェクトを追加] をクリックします。モバイルアプリと関連付けられた既存の Google プロジェクトがある場合は、[プロジェクト名] プルダウン メニューから選択します。それ以外の場合は、プロジェクト名を入力して新しいプロジェクトを作成します。
    2. 省略可: プロジェクト ID を編集します。プロジェクトに一意の ID が自動的に付与され、データベース URL や Firebase Hosting サブドメインなどの一般公開される Firebase の機能で使用されます。特定のサブドメインを使用する場合は、この時点でプロジェクト ID を変更できます(後で変更できません)。
    3. 残りの設定手順に沿って操作した後、[プロジェクトを作成](または既存のプロジェクトを使用している場合は [Firebase を追加])をクリックして、プロジェクト用のリソースのプロビジョニングを開始します。通常、この処理には数分かかります。処理が完了すると、プロジェクトの概要が表示されます。

    Android

    1. [Android アプリに Firebase を追加] をクリックし、設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に実行されることがあります。その場合は、構成ファイルをダウンロードするだけでかまいません。
    2. 求められたら、アプリのパッケージ名を入力します。必ずアプリで使用しているパッケージ名を入力してください。パッケージ名を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
    3. 処理中に google-services.json ファイルをダウンロードします。このファイルは、いつでもダウンロードできます。
    4. 初期化コードを追加したらアプリを実行して、Firebase を正常にインストールしたという確認を Firebase コンソールに送信します。

    iOS

    1. [iOS アプリに Firebase を追加] をクリックして設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に実行されることがあります。その場合は、構成ファイルをダウンロードするだけでかまいません。
    2. 求められたら、アプリのバンドル ID を入力します。必ずアプリで使用しているバンドル ID を入力してください。バンドル ID を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
    3. 処理中に GoogleService-Info.plist ファイルをダウンロードします。このファイルは、いつでもダウンロードできます。
    4. 初期化コードを追加してアプリを実行すると、Firebase を正常にインストールしたという確認のメッセージが Firebase コンソールに送信されます。
    5. Firebase コンソールからダウンロードした GoogleService-Info.plist を、Unity プロジェクトの任意のフォルダにドラッグします。

    アプリに Firebase Unity SDK を追加する

    1. Firebase Unity SDK をダウンロードします。
    2. [Assets] > [Import Package] > [Custom Package] メニュー項目を選択します。
    3. ダウンロードしておいた Firebase Unity SDK から FirebaseAuth.unitypackage パッケージをインポートします。
    4. [Import Unity Package] ウィンドウが表示されたら [Import] ボタンをクリックします。

    SDK の初期化

    Android の Firebase Unity SDK には Google Play 開発者サービスが必要であり、SDK を使用する前に最新版にしておく必要があります。次のコードをアプリケーションの先頭に追加して、SDK で他のメソッドを呼び出す前に Google Play 開発者サービスを確認し、必要であれば、Firebase Unity SDK で必要とされるバージョンに更新します。

    Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
      var dependencyStatus = task.Result;
      if (dependencyStatus == Firebase.DependencyStatus.Available) {
        // Create and hold a reference to your FirebaseApp, i.e.
        //   app = Firebase.FirebaseApp.DefaultInstance;
        // where app is a Firebase.FirebaseApp property of your application class.
    
        // Set a flag here indicating that Firebase is ready to use by your
        // application.
      } else {
        UnityEngine.Debug.LogError(System.String.Format(
          "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
        // Firebase Unity SDK is not safe to use here.
      }
    });
    

    アプリをビルドする

    Android

    1. [File] > [Build Settings] メニュー項目を選択します。
    2. [Platform] リストから [Android] を選択します。
    3. [Switch Platform] をクリックし、ターゲット プラットフォームとして [Android] を選択します。
    4. Unity ステータスバーの右下隅にあるスピナー(コンパイル中)アイコンが停止するまで待ちます。
    5. [Build and Run] をクリックします。

    iOS

    1. [File] > [Build Settings] メニュー項目を選択します。
    2. [Platform] リストから [iOS] を選択します。
    3. [Switch Platform] をクリックし、ターゲット プラットフォームとして [iOS] を選択します。
    4. Unity ステータスバーの右下隅にあるスピナー(コンパイル中)アイコンが停止するまで待ちます。
    5. [Build and Run] をクリックします。

  • プロジェクトのサーバーキーを取得します。
    1. プロジェクトの設定の [サービス アカウント] ページに移動します。
    2. [サービス アカウント] ページの [Firebase Admin SDK] セクションの一番下にある [新しい秘密鍵を生成] をクリックします。
    3. 新しいサービス アカウントの公開鍵 / 非公開鍵のペアが、お使いのパソコンに自動的に保存されます。認証サーバーにこのファイルをコピーします。
  • Firebase で認証する

    すべての API 呼び出しは FirebaseAuth クラスを使用して行われます。このクラスには、FirebaseAuth.DefaultInstance を通じてアクセスできます。
    Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    

    認証サーバーのトークンを使用して、Firebase.Auth.FirebaseAuth.SignInWithCustomTokenAsync を呼び出します。

    1. ユーザーがアプリにログインしたら、そのユーザーのログイン認証情報(たとえば、ユーザー名とパスワード)を認証サーバーに送信します。サーバーにより認証情報が確認され、認証情報が有効な場合は、カスタム トークンが返されます。
    2. 認証サーバーからカスタム トークンを受け取ったら、Firebase.Auth.FirebaseAuth.SignInWithCustomTokenAsync に渡してユーザーのログインを行います。
      auth.SignInWithCustomTokenAsync(custom_token).ContinueWith(task => {
        if (task.IsCanceled) {
          Debug.LogError("SignInWithCustomTokenAsync was canceled.");
          return;
        }
        if (task.IsFaulted) {
          Debug.LogError("SignInWithCustomTokenAsync encountered an error: " + task.Exception);
          return;
        }
      
        Firebase.Auth.FirebaseUser newUser = task.Result;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            newUser.DisplayName, newUser.UserId);
      });
      

    次のステップ

    ユーザーが初めてログインすると、新しいユーザー アカウントが作成され、ユーザーがログインに使用した認証情報(ユーザー名とパスワード、電話番号、または認証プロバイダ情報)にアカウントがリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するために使用できます。

    • アプリでは、Firebase.Auth.FirebaseUser オブジェクトからユーザーの基本的なプロフィール情報を取得できます。

      Firebase.Auth.FirebaseUser user = auth.CurrentUser;
      if (user != null) {
        string name = user.DisplayName;
        string email = user.Email;
        System.Uri photo_url = user.PhotoUrl;
        // The user's Id, unique to the Firebase project.
        // Do NOT use this value to authenticate with your backend server, if you
        // have one; use User.TokenAsync() instead.
        string uid = user.UserId;
      }
      
    • Firebase Realtime Database と Cloud Storage のセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を auth 変数から取得し、それを使用して、ユーザーがアクセス可能なデータを制御できます。

    既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーが複数の認証プロバイダを使用してアプリにログインできるようになります。

    ユーザーのログアウトを行うには SignOut() を呼び出します。

    auth.SignOut();

    フィードバックを送信...

    ご不明な点がありましたら、Google のサポートページをご覧ください。