Appleプラットフォームのカスタムプロバイダーでアプリチェックを有効にする

このページでは、カスタム App Check プロバイダーを使用して、Apple アプリで App Check を有効にする方法について説明します。アプリチェックを有効にすると、アプリのみがプロジェクトのFirebaseリソースにアクセスできるようになります。

組み込みプロバイダーで App Check を使用する場合は、App Attest を使用したApp Check および DeviceCheckを使用したApp Check のドキュメントを参照してください。

あなたが始める前に

1. App Check ライブラリをアプリに追加する

  1. App Check の依存関係をプロジェクトのPodfileに追加します。

    pod 'FirebaseAppCheck'

    または、代わりにSwift Package Managerを使用することもできます。

    また、依存しているすべての Firebase サービス クライアント ライブラリの最新バージョンを使用していることを確認してください。

  2. pod installを実行し、作成された.xcworkspaceファイルを開きます。

2. App Check プロトコルを実装する

最初に、 AppCheckProviderおよびAppCheckProviderFactoryプロトコルを実装するクラスを作成する必要があります。

AppCheckProviderクラスにはgetToken(completion:)メソッドが必要です。このメソッドは、カスタム App Check プロバイダーが信頼性の証明として必要とするあらゆる情報を収集し、それを App Check トークンと引き換えにトークン取得サービスに送信します。 App Check SDK はトークンのキャッシュを処理するため、 getToken(completion:)の実装では常に新しいトークンを取得してください。

迅速

class YourCustomAppCheckProvider: NSObject, AppCheckProvider {
    var app: FirebaseApp

    init(withFirebaseApp app: FirebaseApp) {
        self.app = app
        super.init()
    }

    func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
        DispatchQueue.main.async {
            // Logic to exchange proof of authenticity for an App Check token.
            // ...

            // Create AppCheckToken object.
            let exp = Date(timeIntervalSince1970: expirationFromServer)
            let token = AppCheckToken(
                token: tokenFromServer,
                expirationDate: exp
            )

            // Pass the token or error to the completion handler.
            handler(token, nil)
        }
    }
}

Objective-C

@interface YourCustomAppCheckProvider : NSObject <FIRAppCheckProvider>

@property FIRApp *app;

- (id)initWithApp:(FIRApp *)app;

@end

@implementation YourCustomAppCheckProvider

- (id)initWithApp:app {
    self = [super init];
    if (self) {
        self.app = app;
    }
    return self;
}

- (void)getTokenWithCompletion:(nonnull void (^)(FIRAppCheckToken * _Nullable,
                                                 NSError * _Nullable))handler {
    dispatch_async(dispatch_get_main_queue(), ^{
        // Logic to exchange proof of authenticity for an App Check token.
        // ...

        // Create FIRAppCheckToken object.
        NSTimeInterval exp = expirationFromServer;
        FIRAppCheckToken *token
            = [[FIRAppCheckToken alloc] initWithToken:tokenFromServer
                                       expirationDate:[NSDate dateWithTimeIntervalSince1970:exp]];

        // Pass the token or error to the completion handler.
        handler(token, nil);
    });
}

@end

また、 AppCheckProvider実装のインスタンスを作成するAppCheckProviderFactoryクラスを実装します。

迅速

class YourCustomAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
    return YourCustomAppCheckProvider(withFirebaseApp: app)
  }
}

Objective-C

@interface YourCustomAppCheckProviderFactory : NSObject <FIRAppCheckProviderFactory>
@end

@implementation YourCustomAppCheckProviderFactory

- (nullable id<FIRAppCheckProvider>)createProviderWithApp:(FIRApp *)app {
    return [[YourCustomAppCheckProvider alloc] initWithApp:app];
}

@end

3.アプリチェックを初期化します

次の初期化コードをアプリ デリゲートまたはアプリ初期化子に追加します。

迅速

let providerFactory = YourAppCheckProviderFactory()
AppCheck.setAppCheckProviderFactory(providerFactory)

FirebaseApp.configure()

Objective-C

YourAppCheckProviderFactory *providerFactory =
        [[YourAppCheckProviderFactory alloc] init];
[FIRAppCheck setAppCheckProviderFactory:providerFactory];

[FIRApp configure];

App Checkライブラリがアプリにインストールされたら、更新されたアプリのユーザーへの配布を開始します。

更新されたクライアントアプリは、Firebaseへのすべてのリクエストとともにアプリチェックトークンの送信を開始しますが、Firebase製品では、Firebaseコンソールの[アプリチェック]セクションで適用を有効にするまで、トークンが有効である必要はありません。詳細については、次の2つのセクションを参照してください。

4.リクエストの指標を監視する

更新されたアプリがユーザーの手に渡ったので、使用しているFirebase製品に対してアプリチェックの実施を有効にできます。ただし、そうする前に、そうすることで既存の正当なユーザーを混乱させないことを確認する必要があります。

リアルタイムデータベース、Cloud Firestore、およびCloud Storage

Realtime Database、Cloud Firestore、およびCloud Storageでこの決定を行うために使用できる重要なツールは、アプリチェックリクエストの指標画面です。

製品のアプリチェックリクエストの指標を表示するには、Firebaseコンソールのアプリチェックセクションを開きます。例えば:

アプリチェックメトリックページのスクリーンショット

各製品のリクエストメトリックは、次の4つのカテゴリに分類されます。

  • 確認済みのリクエストとは、有効なアプリチェックトークンを持つリクエストです。アプリチェックの実施を有効にすると、このカテゴリのリクエストのみが成功します。

  • 古いクライアントリクエストとは、アプリチェックトークンがないリクエストです。これらのリクエストは、アプリチェックがアプリに含まれる前の古いバージョンのFirebaseSDKからのものである可能性があります。

  • 不明な発信​​元のリクエストとは、App Checkトークンが欠落していて、FirebaseSDKからのものではないように見えるリクエストです。これらは、盗まれたAPIキーを使用して行われたリクエスト、またはFirebaseSDKを使用せずに行われた偽造されたリクエストからのものである可能性があります。

  • 無効なリクエストとは、無効なアプリチェックトークンを持つリクエストです。これは、アプリを偽装しようとしている不正なクライアントからのものか、エミュレートされた環境からのものである可能性があります。

アプリのこれらのカテゴリの分布は、施行を有効にすることを決定したときに通知する必要があります。ここにいくつかのガイドラインがあります:

  • 最近のリクエストのほとんどすべてが検証済みのクライアントからのものである場合は、施行を有効にしてバックエンドリソースの保護を開始することを検討してください。

  • 最近のリクエストの大部分が古いクライアントからのものである場合は、ユーザーの混乱を避けるために、強制を有効にする前に、より多くのユーザーがアプリを更新するのを待つことを検討してください。リリースされたアプリにAppCheckを適用すると、AppCheckSDKと統合されていない以前のアプリバージョンが破損します。

  • アプリがまだ起動していない場合は、使用中の古いクライアントがないため、すぐにアプリチェックの適用を有効にする必要があります。

クラウド機能

Cloud Functionsの場合、関数のログを調べることでアプリチェックの指標を取得できます。呼び出し可能な関数を呼び出すたびに、次の例のような構造化されたログエントリが出力されます。

{
  "severity": "INFO",    // INFO, WARNING, or ERROR
  "logging.googleapis.com/labels": {"firebase-log-type": "callable-request-verification"},
  "jsonPayload": {
    "message": "Callable header verifications passed.",
    "verifications": {
      // ...
      "app": "MISSING",  // VALID, INVALID, or MISSING
    }
  }
}

次の指標フィルターを使用してログベースのカウンター指標を作成することで、GoogleCloudConsoleでこれらの指標を分析できます。

resource.type="cloud_function"
resource.labels.function_name="YOUR_CLOUD_FUNCTION"
resource.labels.region="us-central1"
labels.firebase-log-type="callable-request-verification"

フィールドjsonPayload.verifications.appCheckを使用してメトリックにラベルを付けます。

5.施行を有効にする

施行を有効にするには、以下の各製品の指示に従ってください。製品の施行を有効にすると、その製品に対する未確認のリクエストはすべて拒否されます。

リアルタイムデータベース、Cloud Firestore、およびCloud Storage

Realtime Database、Cloud Firestore(iOSおよびAndroid)、およびCloud Storageの適用を有効にするには:

  1. Firebaseコンソールの[アプリチェック]セクションを開きます。

  2. 施行を有効にする製品のメトリックビューを展開します。

  3. [強制]をクリックして、選択を確認します。

施行を有効にしてから有効になるまで、最大15分かかる場合があることに注意してください。

クラウド機能

クラウド機能のアプリチェックの実施を有効にするを参照してください。