Android で Apple を使用したユーザーのログイン
このドキュメントでは、Identity Platform を使用して Android アプリに「Apple でログイン」を追加する方法を説明します。
始める前に
Identity Platform を有効にして、基本的な Android アプリを用意します。Identity Platform を有効にしてログインする方法については、クイックスタートをご覧ください。
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 Client SDK を初期化します。
[保存] をクリックします。
クライアント 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 プロバイダでユーザーのログインを行う。