AppleプラットフォームのFirebaseアプリチェック

1.はじめに

Firebase App Checkは、リクエストが本物のアプリやデバイスからのものであることを確認することで、請求詐欺やフィッシングなどの悪用からバックエンドリソースを保護するのに役立ちます。 Firebaseサービスと独自のバックエンドサービスの両方と連携して、リソースを安全に保ちます。あなたは、詳細について学ぶことができFirebaseドキュメントのFirebaseのAppチェック

App Checkは、プラットフォーム固有のサービスを使用して、認証プロバイダーと呼ばれるアプリを識別します。アップルの開発のために、アプリケーションのチェックは、Appleの使用のApp証明のアプリケーションとデバイスが本物であることを確認するために、サービスを。

構築するもの

あなたはするであろう:

  • Firebase App Checkを既存のiOSアプリと統合して、Firebase RealtimeDatabaseのデータを悪用から保護します
  • 実稼働用にAppleApp Attestプロバイダーを構成し、開発用にAppCheckデバッグ認証プロバイダーを構成します。

あなたが学ぶこと

  • Firebase AppCheckを既存のアプリに追加する方法
  • さまざまなFirebaseAppCheck認証プロバイダーをインストールする方法
  • アプリのAppAttestを構成する方法
  • アプリ開発中にシミュレーターでアプリをテストするようにデバッグ認証プロバイダーを構成する方法

必要なもの

2.既存のアプリコードを取得します

Firebaseクイックスタートリポジトリには、さまざまなFirebase製品をデモンストレーションするためのサンプルアプリが含まれています。 Firebase RealtimeDatabaseクイックスタートアプリをベースとして使用します。

クイックスタートリポジトリをチェックアウトします。

git clone https://github.com/firebase/quickstart-ios.git
cd quickstart-ios

リアルタイムデータベースSwiftUIクイックスタートアプリプロジェクトを開きます。

cd database/DatabaseExampleSwiftUI/DatabaseExample
open DatabaseExample.xcodeproj

3.アプリターゲットにアプリチェックの依存関係を追加します

  1. Swift Package Managerが依存関係を解決し、チェックアウトするのを待ちます。
  2. 開き、 Build PhasesのタブDatabaseExample (iOS)アプリのターゲットを: 74e42ef6ecfc1538.png
  3. プレス+ FirebaseAppCheckライブラリを追加するためのボタン: a1cf58b36d6cdf1d.png

4. AppCheckプロバイダーファクトリを作成してインストールします

  1. 別のファイルにファクトリクラスを作成し、例えばMyCustomAppCheckProvider.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.
      return AppCheckDebugProvider(app: app)
    #else
      // Use App Attest provider on real devices.
      return AppAttestProvider(app: app)
    #endif
  }
}
  1. インスタンスを設定しMyAppCheckProviderFactoryファイル内のAppチェックプロバイダファクトリとしてクラスをDatabaseExampleApp.swift.
import Firebase

@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プロジェクトを作成して構成します

アプリチェックはFirebase認証と連携して、Firebase製品を保護します。このコードラボでは、Firebaseコンソールでいくつかの手順を実行して、iOSアプリでFirebaseプロジェクトを設定し、Firebase認証を構成し、保護するRealtime Databaseインスタンスを初期化し、アプリチェックを構成する必要があります。

プロジェクトを作成する

まず、Firebaseプロジェクトを作成する必要があります。

  1. Firebaseコンソール[追加]を選択しますプロジェクト
  2. プロジェクトに名前を付け: App Check Codelab 、例えば。
  3. プロジェクトの作成]クリックします。

リアルタイムデータベースインスタンスを作成する

さて、Firebaseコンソールのリアルタイムデータベース]セクションに移動します。

  1. 新しいFirebaseプロジェクトを選択し、データベース作成ワークフローに従います。
  2. あなたのFirebaseセキュリティルールの開始モードとしてロックモードを選択します。ルールエディタで、デフォルトのルールを次のように置き換えます。
{
    "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"
                    }
                }
            }
        }
    }
}
  1. データベースのリージョンを選択します。
  2. [完了]クリックします。

iOSアプリを接続します

あなたのアプリを結ぶの詳細な説明については、あなたは詳細について読むことができるあなたのiOSプロジェクトにFirebaseを追加します。開始するには、次の主な手順に従います。

  1. 新しいプロジェクトのプロジェクトの概要画面から、お使いのiOSアプリにFirebaseの追加]クリックします。
  2. バンドルIDを「com.google.firebase.codelab.AppCheckCodelab」として入力します。
  3. App StoreIDを「123456」として入力します。
  4. 登録アプリケーション]クリックします。
  5. Firebaseアプリに必要なすべてのFirebaseのメタデータを含む、アプリのGoogleService-のInfo.plistファイルを生成します。
  6. アプリの登録ワークフローでは、ファイルをダウンロードするためにダウンロードGoogleService-のInfo.plistをクリックします。
  7. そのファイルをアプリケーションにコピーして、AppCheckCodelabターゲットに追加します。

FirebaseConsoleで認証を設定する

ふぅ!これまでのところかなりのセットアップですが、しっかりと保持してください。 Firebaseを初めて使用する場合は、ワークフローの重要な部分をすぐに理解できるようになります。

それでは、このアプリの認証を構成しましょう。

認証Eメール/パスワードサインインプロバイダーを有効にする

  1. それでも中Firebaseコンソール、プロジェクトの認証]セクションを開きます。
  2. サインインのメソッドタブを選択します。
  3. 押して、新しいプロバイダの追加]ボタンをクリックします
  4. ネイティブプロバイダセクションEメール/パスワードを選択します。
  5. メール/パスワードを押し、[保存]ボタンを有効にします。

テストユーザーを追加する

  1. 認証セクションのオープン[ユーザー]タブ。
  2. 押して、ユーザーの追加]ボタンをクリックします
  3. テストユーザーの電子メールとパスワードを指定します。

アプリでテストする

アプリケーションを起動し、作成したテストユーザーの電子メールとパスワードを使用してサインインしてみます。サインインすると、投稿の作成、既存の投稿へのコメントの投稿、スター付き/スターなしの投稿を試すことができます。

6.アプリアテステーションアテステーションプロバイダーを構成します

ここでは、FirebaseコンソールでApp Check AppAttestプロバイダーを構成します。

  1. プロジェクト設定→アプリチェック→Firebaseアプリ→アプリ認証を開きます
  2. AppleデベロッパアカウントのチームIDを入力します。 a4303597d7a83e98.png
  3. [保存]ボタンを押します

これで、新しいアプリに接続されたFirebaseプロジェクトが機能し、アプリチェックが有効になりました。これで、特定の認証サービスを構成する準備が整いました。このワークフローの詳細については、を参照してくださいiOSのアプリの証明とアプリのチェックを有効にします

7.アプリケーションのAppAttestを構成します

OK、セットアップは完了です。 Firebase App Check SDKを手に入れて、いくつかのクライアントコードを実装しましょう。

SDKがAppleのAppAttest APIを使用して認証を実行できるように、つまり、リクエストを行っているアプリが、登録した正規のアプリを実行している実際のデバイスであるかどうかを確認できるように、Xcodeプロジェクトを構成しましょう。

  1. AppleDeveloperアカウントでAppAttest機能が有効になっているアプリの明示的なアプリ識別子があることを確認してください。このプロセスについてサポートが必要な場合は、Appleの公式ドキュメントに従ってください。
  2. AppleDeveloperアカウントでアプリのアプリ認証機能を有効にします。
  3. Xcodeプロジェクトにアプリターゲットのアプリ認証機能を追加します。
    • アプリのターゲット設定で開く署名&機能]タブ
    • 押して「+機能
    • ダイアログで、見つけるとApp証明する機能を選択します368fc785f1b94ed5.png
  4. ファイルDatabaseExample.entitlements前のステップを実行した後に表示されます。
  5. DatabaseExample.entitlementsファイル、値変更App Attest Environmentへのキーproduction.

これらの手順を完了し、実際のiOSデバイス(iPhone / iPad)でアプリを起動すると、アプリはリアルタイムデータベースに再びアクセスできるようになります。 iOSシミュレーターはまだ機能しないことに注意してください。開発環境の構成については、次のセクションを参照してください。

参考のため、これについての詳細を学ぶためには、ワークフローを可能にする、参照iOSのアプリの証明とアプリのチェックを有効にします。このコードラボの最後にもリンクされています。

8.シミュレーターのデバッグ認証プロバイダーを構成します

Firebase App Checkデバッグプロバイダーを使用すると、開発プロセス中に、iOSシミュレーターなど、信頼できない環境でFirebase AppCheckを適用してアプリケーションをテストできます。一緒にデバッグプロバイダーを構成しましょう。

アプリにFirebaseデバッグプロバイダーをインストールする

オプション1:ファクトリでデバッグプロバイダーのインスタンスを条件付きで作成します

私たちが作成したときに私たちは、これのほとんどをやったのAppチェックプロバイダーの工場を、今、私たちは、デバッグプロバイダによって生成されたローカルデバッグ秘密のロギングを追加する必要があります。

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 Attestが利用できないOSバージョンでは、DeviceCheckやカスタムなどの他の認証プロバイダーを使用できます。以下の例を参照してください。

import Firebase

class SimpleAppCheckProviderFactory: 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をインストールします

単純な例のためには、一時的または条件付きでインストールすることができAppCheckDebugProviderFactory Firebaseアプリケーションインスタンスを設定する前に:

#if targetEnvironment(simulator)
let providerFactory = AppCheckDebugProviderFactory()
#else
let providerFactory = MyAppCheckProviderFactory()
#endif

AppCheck.setAppCheckProviderFactory(providerFactory)

FirebaseApp.configure()

これにより、独自のAppCheckプロバイダーファクトリを作成するためのコードを数行節約できます。

Firebaseコンソールにデバッグシークレットを登録する

iOSシミュレーターからデバッグシークレットを取得する

  1. あなたはオプション2を選択した場合:AppCheckDebugProviderFactoryをインストールし、追加することによって、アプリのデバッグログを有効-FIRDebugEnabledアプリ起動引数には: bd990922f2cde0cf.png
  2. シミュレーターでアプリを実行する
  3. Xcodeコンソールでデバッグシークレットを見つけます。コンソールフィルターを使用して、より速く見つけることができます。 5f15238dd816fffd.png

デバッグシークレットを登録する

  1. プロジェクト設定の[アプリチェック]タブに移動します。
  2. Firebaseアプリのメニューを開き、[デバッグトークンの管理]を選択します。 631228da2d6680e4.png
  3. Xcodeのコンソールを押し、[保存]ボタンのためにコピーされた秘密を追加します。 704044dc153b7a0f.png

これらの手順を実行すると、アプリチェックが適用されていても、シミュレーターでアプリを使用できるようになります。

でいつものように、このフローの詳細については、マニュアルに記載されています使用アプリケーションはiOSのデバッグプロバイダに確認してください

9. Firebase RealtimeDatabaseのアプリチェックの実施を有効にする

今のところ、我々のアプリは宣言するAppCheckProviderFactory実際のデバイスのために返すことAppAttestProvider iOSアプリが認証を行い、Firebaseバックエンドに結果を送信しますので、。ただし、Firebaseバックエンドは、すべてのデバイス、iOSシミュレーター、スクリプトなどからのリクエストを引き続き受け入れます。このモードは、アプリチェックのない古いバージョンのアプリを使用しているユーザーがいて、アクセスチェックを強制したくない場合に便利です。まだ。

さんはFirebaseアプリは唯一の本物のデバイスからアクセスできることを確認するためのAppチェック執行を有効にしてみましょう。 Firebaseプロジェクトの適用を有効にすると、AppCheckが統合されていない古いアプリバージョンは機能しなくなります。

  1. [商品]セクションの[アプリの確認]タブにあるFirebaseConsoleで、[リアルタイムデータベース]をクリックします
  2. ボタンを押すと強制

100c28596a08bb14.png

  1. 確認のポップアップやプレスでの情報を読む強制ボタン

手順を完了すると、自分以外のアプリケーションはデータベースにアクセスできなくなります。アプリでアプリチェックを無効にして、自分でチェックしてください!

10.おめでとうございます!

6df51ba4ada08168.gif

今、あなたは方法を知っています:

  • アプリチェックを既存のプロジェクトに追加する
  • アプリの製品版用にAppAttest認証プロバイダーを構成します
  • シミュレーターでアプリをテストするようにデバッグ認証プロバイダーを構成します
  • アプリのバージョンロールアウトを観察して、Firebaseプロジェクトにアプリチェックを適用するタイミングを確認してください
  • アプリチェックの実施を有効にします。

このコードラボで説明されている設定はほとんどの場合に機能しますが、AppCheckを使用すると必要に応じて柔軟性を高めることができます。

これらはあなたが役立つと思うかもしれない他のリソースです