Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

AppleとUnityを使用して認証する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Firebase SDK を使用してエンド ツー エンドの OAuth 2.0 サインイン フローを実行することにより、ユーザーが Apple ID を使用して Firebase で認証できるようにすることができます。

あなたが始める前に

Apple を使用してユーザーをサインインするには、まず Apple の開発者サイトで Sign In with Apple を構成してから、Firebase プロジェクトのサインイン プロバイダーとして Apple を有効にします。

Apple デベロッパ プログラムに参加する

Sign In with Apple は、 Apple Developer Programのメンバーのみが構成できます。

Apple でサインインを構成する

Firebase プロジェクトで Apple サインインを有効にし、適切に構成する必要があります。 Apple Developer の構成は、Android および Apple プラットフォームによって異なります。続行する前に、 iOS+および/またはAndroidガイドの「Apple でサインインを構成する」セクションに従ってください。

Apple をサインイン プロバイダーとして有効にする

  1. Firebase コンソールで、 Authセクションを開きます。 [サインイン方法] タブで、 Appleプロバイダーを有効にします。
  2. Apple サインイン プロバイダーの設定を構成します。
    1. アプリを Apple プラットフォームにのみデプロイする場合は、サービス ID、Apple チーム ID、秘密鍵、および鍵 ID フィールドを空のままにしておくことができます。
    2. Android デバイスでのサポート:
      1. Android プロジェクトに Firebase を追加します。 Firebase コンソールでアプリをセットアップするときは、必ずアプリの SHA-1 署名を登録してください。
      2. Firebase コンソールで、 Authセクションを開きます。 [サインイン方法] タブで、 Appleプロバイダーを有効にします。前のセクションで作成したサービス ID を指定します。また、OAuth コード フロー構成セクションで、Apple チーム ID と、前のセクションで作成した秘密鍵と鍵 ID を指定します。

Apple の匿名データ要件に準拠する

Sign In with Apple では、ユーザーはサインイン時にメール アドレスなどのデータを匿名化するオプションを利用できます。このオプションを選択したユーザーは、ドメインがprivaterelay.appleid.comのメール アドレスを持っています。アプリで Sign In with Apple を使用する場合、これらの匿名化された Apple ID に関して適用される開発者ポリシーまたは Apple の条件に従う必要があります。

これには、直接識別される個人情報を匿名化された Apple ID に関連付ける前に、必要なユーザーの同意を得ることも含まれます。 Firebase Authentication を使用する場合、これには次のアクションが含まれる場合があります。

  • メールアドレスを匿名化された Apple ID に、またはその逆にリンクします。
  • 電話番号を匿名化された Apple ID にリンクする、またはその逆を行う
  • 非匿名のソーシャル認証情報 (Facebook、Google など) を匿名化された Apple ID にリンクするか、その逆を行います。

上記のリストは網羅的なものではありません。アプリが Apple の要件を満たしていることを確認するには、開発者アカウントのメンバーシップ セクションにある Apple Developer Program License Agreement を参照してください。

Firebase.Auth.FirebaseAuthクラスにアクセスする

FirebaseAuthクラスは、すべての API 呼び出しのゲートウェイです。 FirebaseAuth.DefaultInstanceからアクセスできます。
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Firebase SDK でログイン フローを処理する

Apple でサインインするプロセスは、Apple と Android のプラットフォームによって異なります。

Apple プラットフォームの場合

  1. Unity の Sign In With Apple Asset Storage Packageなど、Apple サインインナンスとトークン生成を処理するサードパーティのプラグインをインストールします。 Firebase 操作で使用するために、生成されたランダムなナンス文字列を生の文字列状態に組み込むようにコードを変更する必要がある場合があります (つまり、ノンスの SHA256 ダイジェスト形式が作成される前にそのコピーを保存します)。

  2. 結果のトークン文字列と生の nonce を使用して Firebase Credential を作成し、Firebase にサインインします。

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

  3. 同じパターンをReauthenticateAsyncで使用できます。これを使用して、最近のログインが必要な機密操作の新しい資格情報を取得できます。詳細については、ユーザーの管理を参照してください。

  4. Apple プラットフォームで Apple サインインとリンクすると、既存の Firebase アカウントがすでに Apple アカウントにリンクされているというエラーが発生する場合があります。これが発生すると、標準のFirebase.FirebsaeExceptionの代わりにFirebase.Auth.FirebaseAccountLinkExceptionがスローされます。例外にはUserInfo.UpdatedCredentialプロパティが含まれており、有効な場合はFirebaseAuth.SignInWithCredentialを介して Apple にリンクされたユーザーをサインインするために使用できます。更新された資格情報により、サインイン操作のために nonce を使用して新しい Apple サインイン トークンを生成する必要がなくなります。

    LinkWithCredentialAsyncは、リンクの失敗時に標準のFirebase.FirebaseExceptionを引き続きスローするため、更新された資格情報を返すことができないことに注意してください。

    auth.CurrentUser.LinkAndRetrieveDataWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompleted) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( signInTask => {
                      // Handle Sign in result.
                    });
                } else {
                  DebugLog("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

Android の場合

Android では、Firebase SDK を使用してウェブベースの汎用 OAuth ログインをアプリに統合し、エンド ツー エンドのサインイン フローを実行して、Firebase でユーザーを認証します。

Firebase SDK でサインイン フローを処理するには、次の手順に従います。

  1. Apple に適切なプロバイダー ID で構成されたFederatedOAuthProviderDataのインスタンスを構築します。

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. オプション:認証プロバイダーから要求するデフォルト以外の追加の OAuth 2.0 スコープを指定します。

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. オプション: Apple のサインイン画面を英語以外の言語で表示する場合は、 localeパラメーターを設定します。サポートされているロケールについては、 Apple でサインインに関するドキュメントを参照してください。

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. プロバイダー データが構成されたら、それを使用して FederatedOAuthProvider を作成します。

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Auth プロバイダ オブジェクトを使用して Firebase で認証します。他の FirebaseAuth 操作とは異なり、これは、ユーザーが資格情報を入力できる Web ビューをポップアップ表示することにより、UI を制御することに注意してください。

    サインイン フローを開始するには、 signInWithProviderを呼び出します。

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. 同じパターンをReauthenticateWithProviderで使用できます。これを使用して、最近のログインが必要な機密操作の新しい資格情報を取得できます。

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. また、 linkWithCredential()を使用して、さまざまな ID プロバイダーを既存のアカウントにリンクできます。

    Apple では、Apple アカウントを他のデータにリンクする前に、ユーザーから明示的な同意を得る必要があることに注意してください。

    たとえば、Facebook アカウントを現在の Firebase アカウントにリンクするには、ユーザーが Facebook にサインインして取得したアクセス トークンを使用します。

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkAndRetrieveDataWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkAndRetrieveDataWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkAndRetrieveDataWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.SignInResult signInResult = task.Result;
          Firebase.Auth.FirebaseUser user = signInResult.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

Apple Notes でサインインする

Firebase Auth でサポートされている他のプロバイダーとは異なり、Apple は写真の URL を提供していません。

また、ユーザーが自分の電子メールをアプリと共有しないことを選択した場合、Apple はそのユーザーに固有の電子メール アドレス ( xyz@privaterelay.appleid.comの形式) をプロビジョニングし、それをアプリと共有します。プライベート メール リレー サービスを設定した場合、Apple は匿名化されたアドレスに送信されたメールをユーザーの実際のメール アドレスに転送します。

Apple は、ユーザーが初めてサインインしたときにのみ、表示名などのユーザー情報をアプリと共有します。通常、Firebase は、ユーザーが初めて Apple にサインインしたときに表示名を保存します。これはgetCurrentUser().getDisplayName()で取得できます。ただし、以前に Apple を使用して Firebase を使用せずにユーザーをアプリにサインインさせた場合、Apple は Firebase にユーザーの表示名を提供しません。

次のステップ

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

アプリでは、firebase::auth::user オブジェクトからユーザーの基本的なプロフィール情報を取得できます。ユーザーの管理を参照してください。

Firebase Realtime Database と Cloud Storage セキュリティ ルールでは、ログインしているユーザーの一意のユーザー ID を auth 変数から取得し、それを使用してユーザーがアクセスできるデータを制御できます。