Android で Apple を使用したユーザーのログイン

このドキュメントでは、Identity Platform を使用して Android アプリに「Apple でログイン」を追加する方法を説明します。

始める前に

  • Identity Platform を使用する Android アプリを作成します。

  • Apple Developer Program に参加します。

Apple によりアプリを構成する

Apple Developer サイトで次の手順を行います。

  1. Web 向けに「Appleでログイン」を設定するの手順に従います。以下に例を示します。

    1. 次のような戻り URL を登録します。

      https://project-id.firebaseapp.com/__/auth/handler
      
    2. 次の URL でファイルを一時的にホストしてドメインを確認します。

      https://project-id.firebaseapp.com/.well-known/apple-developer-domain-association.txt
      

    また、サービス IDApple チーム ID をメモしておきます。これらは次のセクションで必要になります。

  2. Apple の秘密鍵を使用してログインを作成しますとその ID は次のセクションで必要になります。

  3. Identity Platform を使用してユーザーにメールを送信する場合は、Apple のプライベート メールリレー サービスを使用してプロジェクトを構成します。

    noreply@project-id.firebaseapp.com
    

    また、アプリにカスタム メール テンプレートがある場合は、それを使用することもできます。

Apple の匿名化データの要件を遵守する

Apple には、メールアドレスを含む自分のデータを匿名化できるオプションがあります。Apple は、このオプションを選択したユーザーに、ドメインが privaterelay.appleid.com の難読化されたメールアドレスを割り当てます。

アプリは、匿名化された Apple ID に関して、Apple が定めるデベロッパー ポリシーと利用規約を遵守する必要があります。これには、個人を特定できる情報(PII)を匿名化された Apple ID に関連付ける前にユーザーの同意を得ることも含まれます。PII が含まれるアクションには次のようなものがあります(ただし、これらに限定されません)。

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

詳しくは、Apple デベロッパー アカウントの Apple Developer Program License Agreement をご覧ください。

Apple をプロバイダとして構成する

Apple を ID プロバイダとして構成するには:

  1. Google Cloud コンソールで [ID プロバイダ] ページに移動します。

    [ID プロバイダ] ページに移動

  2. [プロバイダを追加] をクリックします。

  3. リストから [Apple] を選択します。

  4. [プラットフォーム] で [Android] を選択します。

  5. サービス IDApple チーム ID鍵 ID秘密鍵を入力します。

  6. [承認済みドメイン] で [ドメインを追加] をクリックして、アプリのドメインを登録します。開発目的の場合は、localhost はデフォルトですでに有効になっています。

  7. [アプリケーションの構成] で [Android] をクリックします。このスニペットをアプリのコードにコピーして、Identity Platform クライアント SDK を初期化します。

  8. [保存] をクリックします。

Client SDK を使用したユーザーのログイン

  1. ID apple.com を使用して、OAuthProvider プロバイダ オブジェクトのインスタンスを作成します。

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
    

    Kotlin

    val provider = OAuthProvider.newBuilder("apple.com")
    
  2. 省略可: OAuth スコープを追加します。スコープとは、Apple からどんなデータを要求するかを指定します。より機密性の高いデータには、特定のスコープが必要になる場合があります。デフォルトでは、[1 つのメールアドレスにつき 1 つのアカウント] が有効である場合、Identity Platform では emailname のスコープをリクエストします。

    Java

    List<String> scopes =
        new ArrayList<String>() {
          {
            add("email");
            add("name");
          }
        };
    provider.setScopes(scopes);
    

    Kotlin

    provider.setScopes(arrayOf("email", "name"))
    
  3. 省略可: 認証フローをローカライズします。言語を指定するか、デバイスのデフォルトの言語を使用できます。

    Java

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr");
    

    Kotlin

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr");
    
  4. Identity Platform を使用して、ユーザーをログインさせます。

    1. startActivityForSignInWithProvider() を呼び出して、レスポンスがすでに存在するかどうかを確認します。

      Java

      mAuth = FirebaseAuth.getInstance();
      Task<AuthResult> pending = mAuth.getPendingAuthResult();
      if (pending != null) {
          pending.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                  Log.d(TAG, "checkPending:onSuccess:" + authResult);
                  // Get the user profile with authResult.getUser() and
                  // authResult.getAdditionalUserInfo(), and the ID
                  // token from Apple with authResult.getCredential().
              }
          }).addOnFailureListener(new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                  Log.w(TAG, "checkPending:onFailure", e);
              }
          });
      } else {
          Log.d(TAG, "pending: null");
      }
      

      Kotlin

      val pending = auth.pendingAuthResult
      if (pending != null) {
          pending.addOnSuccessListener { authResult ->
              Log.d(TAG, "checkPending:onSuccess:$authResult")
              // Get the user profile with authResult.getUser() and
              // authResult.getAdditionalUserInfo(), and the ID
              // token from Apple with authResult.getCredential().
          }.addOnFailureListener { e ->
              Log.w(TAG, "checkPending:onFailure", e)
          }
      } else {
          Log.d(TAG, "pending: null")
      }
      

      ログインすると、アクティビティがバックグラウンドになります。つまり、認証フロー中にシステムがアクティビティを再要求する可能性があります。結果がすでに存在するかどうかを確認することで、ユーザーは 2 回ログインする必要がなくなります。

    2. 保留中の結果がない場合は、startActivityForSignInWithProvider() を呼び出します。

      Java

      mAuth.startActivityForSignInWithProvider(this, provider.build())
          .addOnSuccessListener(
                  new OnSuccessListener<AuthResult>() {
                      @Override
                      public void onSuccess(AuthResult authResult) {
                          // Sign-in successful!
                          Log.d(TAG, "activitySignIn:onSuccess:" + authResult.getUser());
                          FirebaseUser user = authResult.getUser();
                          // ...
                      }
                  })
          .addOnFailureListener(
                  new OnFailureListener() {
                      @Override
                      public void onFailure(@NonNull Exception e) {
                          Log.w(TAG, "activitySignIn:onFailure", e);
                      }
                  });
      

      Kotlin

      auth.startActivityForSignInWithProvider(this, provider.build())
        .addOnSuccessListener { authResult ->
            // Sign-in successful!
            Log.d(TAG, "activitySignIn:onSuccess:${authResult.user}")
            val user = authResult.user
            // ...
        }
        .addOnFailureListener { e ->
            Log.w(TAG, "activitySignIn:onFailure", e)
        }
      

他の多くの ID プロバイダとは異なり、Apple では写真の URL が提供されません。

ユーザーがアプリと実際のメールの共有を行わない場合、Apple は代わりにそのユーザーに固有のメールアドレスをプロビジョニングして共有します。このメールの形式は xyz@privaterelay.appleid.com です。プライベート メールリレー サービスを構成した場合、Apple は匿名化されたアドレスに送信されたメールを、ユーザーの実際のメールアドレスに転送します。

Apple が表示名などのユーザー情報をアプリと共有するのは、ユーザーの初回ログイン時のみです。ほとんどの場合、Identity Platform がこのデータを格納しており、その後のセッションでは firebase.auth().currentUser.displayName を使用してそれを取得できます。ただし、Identity Platform と統合する前に、ユーザーが Apple を使用してアプリにログインできるようにした場合、ユーザー情報は利用できません。

次のステップ