この Codelab について
1. はじめに
Firebase App Check は、リクエストが正規のアプリとデバイスから送信されていることを確認することで、請求詐欺やフィッシングなどの不正行為からバックエンド リソースを保護します。Firebase サービスとお客様のバックエンド サービスの両方と連携して、リソースを安全に保ちます。
Firebase App Check について詳しくは、Firebase のドキュメントをご覧ください。
App Check は、プラットフォーム固有のサービスを使用して、アプリやデバイスの完全性を確認します。これらのサービスは証明書プロバイダと呼ばれます。そのようなプロバイダの 1 つが Apple の App Attest サービスです。App Check は、このサービスを使用して Apple アプリとデバイスの真正性を確認できます。
作成するアプリの概要
この Codelab では、既存のサンプルアプリに App Check を追加して適用し、プロジェクトの Realtime Database が不正なアプリやデバイスによるアクセスから保護されるようにします。
ラボの内容
- 既存のアプリに Firebase App Check を追加する方法。
- さまざまな Firebase App Check 構成証明プロバイダをインストールする方法。
- アプリの App Attest を構成する方法。
- アプリ開発中にシミュレータでアプリをテストできるように、デバッグ証明書プロバイダを構成する方法。
必要なもの
- Xcode 13.3.1 以降
- 新しいアプリ ID を作成できる Apple デベロッパー アカウント
- App Attest をサポートする iOS/iPadOS デバイス(App Attest API の提供状況をご確認ください)
2. スターター プロジェクトを入手する
Firebase のクイックスタート(iOS 用)リポジトリには、さまざまな Firebase プロダクトを示すサンプルアプリが含まれています。この Codelab では、SwiftUI 用の Firebase Database クイックスタート アプリをベースとして使用します。
コマンドラインから Firebase Quickstarts for iOS リポジトリのクローンを作成します。
git clone https://github.com/firebase/quickstart-ios.git cd quickstart-ios
Xcode で Realtime Database SwiftUI クイックスタート アプリ プロジェクトを開きます。
cd database/DatabaseExampleSwiftUI/DatabaseExample xed .
3. アプリに App Check を追加する
- Swift Package Manager がプロジェクトの依存関係を解決するのを待ちます。
DatabaseExample (iOS)
アプリ ターゲットの [全般] タブを開きます。次に、[フレームワーク、ライブラリ、埋め込みコンテンツ] セクションで [+] ボタンをクリックします。- 選択して
FirebaseAppCheck
を追加します。
4. App Check プロバイダ ファクトリーを作成してインストールする
Shared
ファイル グループに、AppCheck
という名前の新しいグループを追加します。- このグループ内に、別のファイル(
MyAppCheckProviderFactory.swift
など)でファクトリー クラスを作成し、DatabaseExample (iOS)
ターゲットに追加します。import Firebase
class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
#if targetEnvironment(simulator)
// App Attest is not available on simulators.
// Use a debug provider.
return AppCheckDebugProvider(app: app)
#else
// Use App Attest provider on real devices.
return AppAttestProvider(app: app)
#endif
}
} - 次に、
DatabaseExampleApp.swift
でFirebaseAppCheck
をインポートし、MyAppCheckProviderFactory
クラスのインスタンスを App Check プロバイダ ファクトリとして設定します。import SwiftUI
import FirebaseCore
import FirebaseAppCheck
@main
struct DatabaseExampleApp: App {
init() {
// Set an instance of MyAppCheckProviderFactory as an App Check
// provider factory before configuring Firebase.
AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
FirebaseApp.configure()
}
...
}
5. Firebase プロジェクトを作成して構成する
iOS プロジェクトで App Check を使用するには、Firebase コンソールで次の手順を実施する必要があります。
- Firebase プロジェクトを設定する。
- iOS アプリを Firebase プロジェクトに追加します。
- Firebase Authentication を構成します。
- 保護する Realtime Database インスタンスを初期化します。
- App Check を構成します。
プロジェクトを作成する
まず、Firebase プロジェクトを作成する必要があります。
- Firebase コンソールで [プロジェクトを追加] を選択します。
- プロジェクトに
App Check Codelab
という名前を付けます。 - [続行] をクリックします。
- このプロジェクトで Google アナリティクスを無効にして、[プロジェクトを作成] をクリックします。
Realtime Database インスタンスを作成する
Firebase コンソールの [Realtime Database] セクションに移動します。
- [データベースを作成] ボタンをクリックして、データベース作成ワークフローを開始します。
- データベースのデフォルトのロケーション(
us-central1
)は変更せずに、[次へ] をクリックします。 - [ロックされたモード] が選択されていることを確認し、[有効にする] ボタンをクリックしてデータベースのセキュリティ ルールを有効にします。
- Realtime Database ブラウザの [ルール] タブに移動し、デフォルトのルールを次のように置き換えます。
{
"rules": {
// User profiles are only readable/writable by the user who owns it
"users": {
"$UID": {
".read": "auth.uid == $UID",
".write": "auth.uid == $UID"
}
},
// Posts can be read by anyone but only written by logged-in users.
"posts": {
".read": true,
".write": "auth.uid != null",
"$POSTID": {
// UID must match logged in user and is fixed once set
"uid": {
".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
},
// User can only update own stars
"stars": {
"$UID": {
".validate": "auth.uid == $UID"
}
}
}
},
// User posts can be read by anyone but only written by the user that owns it,
// and with a matching UID
"user-posts": {
".read": true,
"$UID": {
"$POSTID": {
".write": "auth.uid == $UID",
".validate": "data.exists() || newData.child('uid').val() == auth.uid"
}
}
},
// Comments can be read by anyone but only written by a logged in user
"post-comments": {
".read": true,
".write": "auth.uid != null",
"$POSTID": {
"$COMMENTID": {
// UID must match logged in user and is fixed once set
"uid": {
".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
}
}
}
}
}
} - [公開] ボタンをクリックして、更新されたセキュリティ ルールを有効にします。
iOS アプリを Firebase に接続する準備をする
サンプルアプリを物理デバイスで実行するには、プロジェクトを開発チームに追加して、Xcode が必要なプロビジョニング プロファイルを管理できるようにする必要があります。サンプルアプリをデベロッパー アカウントに追加する手順は次のとおりです。
- Xcode で、プロジェクト ナビゲータで
DatabaseExample
プロジェクトを選択します。 DatabaseExample (iOS)
ターゲットを選択し、[署名と機能] タブを開きます。- 「DatabaseExample(iOS)の署名には開発チームが必要です」というエラー メッセージが表示されます。
- バンドル ID を一意の識別子に更新します。最も簡単な方法は、ウェブサイトの逆ドメイン名を使用することです(例:
com.acme.samples.firebase.quickstart.DatabaseExample
)。この ID は使用せず、独自の一意の ID を選択してください。 - 開発チームを選択します。
- すべて正常に完了すると、Xcode に「プロビジョニング プロファイル: Xcode 管理対象プロファイル」と表示され、このラベルの横に小さな情報アイコンが表示されます。このアイコンをクリックすると、プロビジョニング プロファイルの詳細が表示されます。
iOS アプリを接続する
アプリの接続について詳しくは、iOS プロジェクトに Firebase を追加するに関するドキュメントをご覧ください。始めるにあたっては、Firebase コンソールで次の主な手順を行います。
- 新しいプロジェクトの [Project Overview] 画面で、[+ Add app] ボタンをクリックし、[iOS+] アイコンをクリックして、Firebase プロジェクトに新しい iOS アプリを追加します。
- アプリのバンドル ID を入力します(前のセクションで定義した ID を使用します。例:
com.acme.samples.firebase.quickstart.DatabaseExample
。この ID は一意の識別子である必要があります)。 - [アプリを登録] をクリックします。
- Firebase は、アプリに必要なすべての Firebase メタデータを含む
GoogleService-Info.plist
ファイルを生成します。 - [GoogleService-Info.plist をダウンロード] をクリックしてファイルをダウンロードします。
- Xcode では、プロジェクトに
GoogleService-Info.plist
という名前のファイルがすでに含まれています。このファイルをまず削除します。このファイルは、次のステップで独自の Firebase プロジェクトのファイルに置き換えます。 - 前の手順でダウンロードした
GoogleService-Info.plist
ファイルを Xcode プロジェクトのルートフォルダにコピーし、DatabaseExample (iOS)
ターゲットに追加します。名前はGoogleService-Info.plist
にします。 - 登録フローの残りの手順をすべてクリックします。サンプル プロジェクトはすでに正しく設定されているため、コードを変更する必要はありません。
Firebase Authentication を構成する
ぜひここまでの設定は大変でしたが、もう少しお待ちください。Firebase を初めて使用する場合は、ワークフローの重要な部分を学びました。すぐに慣れるはずです。
次に、このアプリの Firebase Authentication を構成します。
認証メール/パスワードによるログイン プロバイダを有効にする
- Firebase コンソールで、コンソールの [Authentication] セクションを開きます。
- [使ってみる] をクリックして、プロジェクトに Firebase Authentication を設定します。
- [ログイン方法] タブを選択します。
- [ネイティブ プロバイダ] セクションで [メール/パスワード] を選択します。
- [メール/パスワード] を有効にして、[保存] をクリックします。
テストユーザーを追加する
- [Authentication] セクションの [Users] タブを開きます。
- [ユーザーを追加] をクリックします。
- テストユーザーのメールアドレスとパスワードを指定し、[ユーザーを追加] をクリックします。
アプリを試す
Xcode に戻り、iOS シミュレータでアプリケーションを実行します。作成したテストユーザーのメールアドレスとパスワードでログインします。ログインすると、投稿の作成、既存の投稿へのコメントの投稿、投稿のスターを付けたり外したりできるようになります。
6. App Attest 構成証明プロバイダを構成する
このステップでは、Firebase コンソールで App Attest プロバイダを使用するように App Check を構成します。
- Firebase コンソールで、コンソールの [App Check] セクションに移動します。
- [開始する] をクリックします。
- [アプリ] タブでアプリをクリックして、詳細を展開します。
- [App Attest] をクリックして App Attest を構成し、Apple デベロッパー アカウントのチーム ID(Apple デベロッパー ポータルの [メンバーシップ] セクションで確認できます)を入力します。
- [保存] をクリックします。
これで、新しいアプリに接続された動作する Firebase プロジェクトが作成され、App Check が有効になりました。
これで、特定の構成証明サービスを構成する準備が整いました。このワークフローの詳細については、iOS で App Attest を使用して App Check を有効にするをご覧ください。
7. アプリケーションの App Attest を構成する
次は、Firebase App Check SDK を使ってクライアント コードを実装します。
まず、SDK が Apple の App Attest API を使用して、アプリから送信されたリクエストがアプリの正当なインスタンスから送信されたものであることを確認できるように、Xcode プロジェクトを構成する必要があります。
- Xcode プロジェクトで、アプリ ターゲットの App Attest 機能を追加します。
- アプリのターゲット設定で [Signing & Capabilities] タブを開きます。
- [+] ボタンをクリックします。
- ダイアログで、App Attest 機能
を見つけて選択します。
- 前の手順を実行すると、Xcode プロジェクトのルートフォルダに
DatabaseExample (iOS).entitlements
ファイルが表示されます。 DatabaseExample (iOS).entitlements
ファイルで、App Attest Environment
キーの値をproduction.
に変更します。
これらの手順を完了して、物理的な iOS デバイス(iPhone/iPad)でアプリを起動しても、アプリは引き続きリアルタイム データベースにアクセスできます。後続のステップで、App Check を適用します。これにより、不正なアプリやデバイスから送信されるリクエストがブロックされます。
このワークフローの詳細については、iOS で App Attest を使用して App Check を有効にするをご覧ください。
8. iOS シミュレータのデバッグ構成証明プロバイダを構成する
Firebase App Check Debug プロバイダを使用すると、開発プロセス中に、iOS シミュレータなどの信頼できない環境で Firebase App Check を適用したアプリをテストできます。次に、デバッグ プロバイダを一緒に構成する必要があります。
アプリに Firebase デバッグ プロバイダをインストールする
オプション 1: ファクトリでデバッグ プロバイダのインスタンスを条件付きで作成する
これらの処理のほとんどは、App Check プロバイダ ファクトリを作成するときに行いました。このステップでは、デバッグ プロバイダによって生成されたローカル デバッグ シークレットのロギングを追加します。これにより、デバッグ目的でアプリのこのインスタンスを Firebase コンソールに登録できます。
MyAppCheckProviderFactory.swift
を次のコードで更新します。
import Firebase
class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
#if targetEnvironment(simulator)
// App Attest is not available on simulators.
// Use a debug provider.
let provider = AppCheckDebugProvider(app: app)
// Print only locally generated token to avoid a valid token leak on CI.
print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")
return provider
#else
// Use App Attest provider on real devices.
return AppAttestProvider(app: app)
#endif
}
}
このアプローチでは、環境に応じて App Check を柔軟に構成できます。たとえば、App Attest を使用できない OS バージョンでは、DeviceCheck などの他の構成証明プロバイダやカスタム構成証明プロバイダを使用できます。以下の例をご覧ください。
import Firebase
class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
#if targetEnvironment(simulator)
// App Attest is not available on simulators.
// Use a debug provider.
let provider = AppCheckDebugProvider(app: app)
// Print only locally generated token to avoid a valid token leak on CI.
print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")
return provider
#else
if #available(iOS 14.0, *) {
// Use App Attest provider on real devices.
return AppAttestProvider(app: app)
} else {
return DeviceCheckProvider(app: app)
}
#endif
}
}
オプション 2: AppCheckDebugProviderFactory
をインストールする
シンプルなケースでは、Firebase アプリ インスタンスを構成する前に、AppCheckDebugProviderFactory
を一時的または条件付きでインストールできます。
init() {
#if targetEnvironment(simulator)
let providerFactory = AppCheckDebugProviderFactory()
#else
let providerFactory = MyAppCheckProviderFactory()
#endif
AppCheck.setAppCheckProviderFactory(providerFactory)
FirebaseApp.configure()
}
これにより、独自の App Check プロバイダ ファクトリーを作成する際に数行のコードを省略できます。
Firebase コンソールでデバッグ用シークレットを登録する
iOS シミュレータからデバッグ シークレットを取得する
AppCheckDebugProviderFactory
のインストールを選択した場合(上記のオプション 2)、アプリの起動引数に-FIRDebugEnabled
を追加して、アプリのデバッグ ロギングを有効にする必要があります。- シミュレータでアプリを実行する
- Xcode コンソールでデバッグ シークレットを探します。コンソール フィルタを使用して、より速く見つけることができます。
注: デバッグ シークレットは、アプリの初回起動時にシミュレータ用に生成され、ユーザーのデフォルトに保存されます。アプリを削除したり、シミュレータをリセットしたり、別のシミュレータを使用したりすると、新しいデバッグ シークレットが生成されます。新しいデバッグ シークレットを登録してください。
デバッグ用シークレットを登録する
- Firebase コンソールに移動し、[App Check] セクションに移動します。
- [アプリ] タブでアプリをクリックして、詳細を展開します。
- オーバーフロー メニューで [デバッグ トークンを管理] を選択します。
- Xcode コンソールからコピーしたシークレットを追加し、[保存 ]
をクリックします。
これらの手順を完了すると、App Check が適用されていても、シミュレータでアプリを使用できるようになります。
注: デバッグ プロバイダは、デバッグ シークレットの漏洩を防ぐために特別に設計されています。現在のアプローチでは、デバッグ用シークレットをソースコードに保存する必要はありません。
このフローについて詳しくは、ドキュメントの iOS で App Check とデバッグ プロバイダを使用するをご覧ください。
9. Firebase Realtime Database で App Check の適用を有効にする
現時点では、アプリは実際のデバイスの AppAttestProvider
を返す AppCheckProviderFactory
を宣言しています。物理デバイスで実行すると、アプリは構成証明を実行し、結果を Firebase バックエンドに送信します。ただし、Firebase バックエンドは、任意のデバイス、iOS シミュレーター、スクリプトなどからのリクエストを引き続き受け入れます。このモードは、App Check のない古いバージョンのアプリを使用しているユーザーがまだいて、アクセス チェックをまだ適用したくない場合に便利です。
次に、App Check の適用を有効にして、Firebase アプリに正当なデバイスからのみアクセスできるようにする必要があります。Firebase プロジェクトで適用を有効にすると、App Check が統合されていない古いアプリ バージョンは機能しなくなります。
- Firebase コンソールの [App Check] セクションで [Realtime Database] をクリックして詳細を展開します。
- [適用] をクリックします。
- 確認ダイアログで情報を読み、[適用] をクリックします。
これらの手順を完了すると、正当なアプリのみがデータベースにアクセスできるようになります。それ以外のアプリはすべてブロックされます。
不正なアプリで Realtime Database にアクセスしてみる
App Check の適用を確認する手順は次のとおりです。
DatabaseExampleApp
のアプリ エントリ ポイントのinit
メソッドで App Check 登録コードをコメントアウトして、App Check 登録をオフにします。- [デバイス] > [すべてのコンテンツと設定を消去] を選択して、シミュレータをリセットします。これにより、シミュレータがワイプされ(デバイス トークンが無効になります)。
- シミュレータでアプリをもう一度実行します。
- 次のエラー メッセージが表示されます。
[FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server. Will not attempt reconnect. Reason: Invalid appcheck token.
App Check を再度有効にするには、次の操作を行います。
DatabaseExampleApp
で App Check 登録コードのコメントを解除します。- アプリを再起動します。
- Xcode のコンソールで、新しい App Check トークンをメモします。
- Firebase コンソールで、アプリの App Check 設定でデバッグ トークンを登録します。
- アプリを再実行します。
- エラー メッセージは表示されなくなり、アプリで新しい投稿やコメントを追加できるようになります。
10. お疲れさまでした
これで、以下の方法を習得しました。
- 既存のプロジェクトに App Check を追加する
- アプリの本番環境バージョンに App Attest 構成証明プロバイダを設定する
- シミュレータでアプリをテストするためのデバッグ構成証明プロバイダを構成する
- アプリ バージョンのロールアウトを監視して、Firebase プロジェクトに App Check を適用するタイミングを把握する
- App Check の適用を有効にする
次のステップ
Remote Config を使用して App Check をユーザーに段階的にロールアウトする方法については、Firebase Remote Config を使用して Firebase App Check を段階的にロールアウトする Codelab をご覧ください。
他にも以下のリソースがございますので、お役立てください。
この Codelab で説明する設定はほとんどのケースで機能しますが、必要に応じて App Check でより柔軟な設定を行うこともできます。詳しくは、次のリンクをご覧ください。