Android で Apple を使用したユーザーのログイン
このドキュメントでは、Identity Platform を使用して Android アプリに「Apple でログイン」を追加する方法を説明します。
始める前に
Identity Platform を使用する Android アプリを作成します。
Apple Developer Program に参加します。
Apple によりアプリを構成する
Apple Developer サイトで次の手順を行います。
Web 向けに「Appleでログイン」を設定するの手順に従います。以下に例を示します。
次のような戻り URL を登録します。
https://project-id.firebaseapp.com/__/auth/handler
次の URL でファイルを一時的にホストしてドメインを確認します。
https://project-id.firebaseapp.com/.well-known/apple-developer-domain-association.txt
また、サービス ID と Apple チーム ID をメモしておきます。これらは次のセクションで必要になります。
Apple の秘密鍵を使用してログインを作成します。鍵とその ID は次のセクションで必要になります。
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 プロバイダとして構成するには:
Google Cloud コンソールで [ID プロバイダ] ページに移動します。
[プロバイダを追加] をクリックします。
リストから [Apple] を選択します。
[プラットフォーム] で [Android] を選択します。
サービス ID、Apple チーム ID、鍵 ID、秘密鍵を入力します。
[承認済みドメイン] で [ドメインを追加] をクリックして、アプリのドメインを登録します。開発目的の場合は、
localhost
はデフォルトですでに有効になっています。[アプリケーションの構成] で [Android] をクリックします。このスニペットをアプリのコードにコピーして、Identity Platform クライアント SDK を初期化します。
[保存] をクリックします。
Client SDK を使用したユーザーのログイン
ID
apple.com
を使用して、OAuthProvider
プロバイダ オブジェクトのインスタンスを作成します。Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
Kotlin
val provider = OAuthProvider.newBuilder("apple.com")
省略可: OAuth スコープを追加します。スコープとは、Apple からどんなデータを要求するかを指定します。より機密性の高いデータには、特定のスコープが必要になる場合があります。デフォルトでは、[1 つのメールアドレスにつき 1 つのアカウント] が有効である場合、Identity Platform では
email
とname
のスコープをリクエストします。Java
List<String> scopes = new ArrayList<String>() { { add("email"); add("name"); } }; provider.setScopes(scopes);
Kotlin
provider.setScopes(arrayOf("email", "name"))
省略可: 認証フローをローカライズします。言語を指定するか、デバイスのデフォルトの言語を使用できます。
Java
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr");
Kotlin
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr");
Identity Platform を使用して、ユーザーをログインさせます。
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 回ログインする必要がなくなります。
保留中の結果がない場合は、
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 を使用してアプリにログインできるようにした場合、ユーザー情報は利用できません。
次のステップ
- Identity Platform ユーザーの詳細について確認する。
- 他の ID プロバイダでユーザーのログインを行う。