Firebase での Apple Sign-In 実装: signInWithProvider と落とし穴
認証
iOS
Firebase
Flutter + Firebase Auth で Sign in with Apple を実装する際の判断材料と落とし穴。
パッケージ選択: firebase_auth 4.x 以降は signInWithProvider(AppleAuthProvider()) で実装でき、sign_in_with_apple パッケージや nonce の自前生成が不要になる。iOS はネイティブシート、Android は Web フロー(Custom Tab)が自動選択される。別パッケージが必要になるのは、資格情報を自前サーバにも送る・ボタン UI を Apple 純正部品にするなどの要件があるときだけ。
落とし穴:
- Apple は表示名・メールを初回認証時しか返さない。2 回目以降は null になるため、表示名を SSO に依存する設計にしない(オンボーディングで必ず自分で設定させるか、初回に確実に保存する)。テスト時は Apple ID 設定画面から「Apple でサインイン」の利用停止で初回状態にリセットできる。
- ユーザーキャンセルの例外コードがプラットフォームで異なる(ネイティブ: 'canceled'、Web フロー: 'web-context-canceled' 等)。キャンセルをエラー表示しないなら複数コードをセットで判定する。
- コードだけでは動かず、3 系統の設定が全て揃う必要がある: (1) Apple Developer の App ID に Sign in with Apple capability、(2) entitlements(
com.apple.developer.applesignin)、(3) 認証基盤側(Firebase Console なら Apple プロバイダ有効化)。どれか欠けると実行時エラーになり、エラー文言からはどの層が欠けているか分かりにくい。 - Android で Apple ログインを提供する場合は Web フロー用に Apple Developer で Services ID の登録が別途必要。
審査上の注意: App Store はサードパーティログイン(Google 等)を置くアプリに Sign in with Apple の同梱を実質必須としている(ガイドライン 4.8)。iOS リリース計画があるなら最初から両方実装しておくと手戻りがない。