ML Kit Android アプリのクラウド認証情報を保護する

Android アプリが ML Kit の Cloud API のいずれかを使用している場合、本番環境でアプリをリリースする前に、不正な API アクセスを防ぐためにいくつかの追加手順を行う必要があります。

本番環境用のアプリでは、認証されたクライアントだけがクラウド サービスにアクセスできるようにします。(説明された方法で認証できるのはルート権限を取得していないデバイスのみであることに注意してください。)

次に、テストと開発の際に便宜上使用できるデバッグ専用の API キーを作成します。

1. Firebase で本番環境用アプリを登録する

まず、本番環境用アプリを Firebase に登録します。

最も簡単な方法は、Firebase プロジェクトを Google Play プロジェクトにリンクすることです。Firebase コンソールのプロジェクト設定の [統合] セクションからリンクできます。

プロジェクトをリンクすると、本番環境用アプリの SHA-1 署名が Firebase プロジェクトにインポートされ、[設定] ページで確認できます。Firebase プロジェクトと Google Play プロジェクトをリンクすると、クラッシュや収益の統計情報を含む他の Google Play データに Firebase がアクセスできるようになり、分析などの Firebase データに対して Google Play がアクセスできるようになります。

また、Firebase プロジェクトと Google Play プロジェクト間でデータを共有したくない場合は、[設定] ページで自分のアプリの SHA-1 署名を指定することもできます。アプリの SHA-1 署名を取得する方法については、クライアントの認証をご覧ください。

2. API キーの範囲を制限する

次に、既存の API キーを構成して、Cloud Vision API へのアクセスを許可しないようにします。

  1. Cloud Console の認証情報ページを開きます。

  2. リスト内の各 API キーについて、編集ビューを開き、[キーの制限] セクションで Cloud Vision API を除く使用可能なすべての API をリストに追加します。

3. デバッグ専用の API キーを作成して使用する

最後に、開発でのみ使用する新しい API キーを作成します。ML Kit は、この API キーを使用して、アプリ認証が不可能な環境(エミュレータで実行しているときなど)でクラウド サービスにアクセスできます。

  1. 開発に使用する新しい API キーを作成します。

    1. Cloud Console の認証情報ページを開きます。
    2. [認証情報を作成] > [API キー] をクリックし、新しい API キーをメモします。このキーによって、認証されていないアプリからの API アクセスが許可されるため、このキーは機密にしておいてください
  2. リリースされたアプリケーションで新しいデバッグ用 API キーが漏洩しないようにするには、デバッグビルド専用の Android マニフェスト ファイルでデバッグ用 API キーを指定します。

    1. デバッグ マニフェストがまだない場合は、[ファイル] > [新規] > [その他] > [Android マニフェスト ファイル] をクリックし、ターゲットのソースセットから debug を選択して、デバッグ マニフェストを作成します。

    2. デバッグ マニフェストに次の宣言を追加します。

      <application>
      <meta-data
          android:name="com.firebase.ml.cloud.ApiKeyForDebug"
          android:value="your-debug-api-key" />
      </application>
      
  3. アプリの ML Kit の設定で、証明書のフィンガープリントを使用して本番環境でクライアントを認証することと、API キー(デバッグキー)をデバッグビルドでのみ使用するように構成します。

    Java
    Android

    FirebaseVisionCloudDetectorOptions.Builder optionsBuilder =
            new FirebaseVisionCloudDetectorOptions.Builder();
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch();
    }
    
    // Set other options. For example:
    optionsBuilder.setModelType(FirebaseVisionCloudDetectorOptions.STABLE_MODEL);
    // ...
    
    // And lastly:
    FirebaseVisionCloudDetectorOptions options = optionsBuilder.build();
    FirebaseVision.getInstance().getVisionCloudLabelDetector(options).detectInImage(myImage);

    Kotlin
    Android

    val optionsBuilder = FirebaseVisionCloudDetectorOptions.Builder()
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch()
    }
    
    // Set other options. For example:
    optionsBuilder.setModelType(FirebaseVisionCloudDetectorOptions.STABLE_MODEL)
    // ...
    
    // And lastly:
    val options = optionsBuilder.build()
    FirebaseVision.getInstance().getVisionCloudLabelDetector(options).detectInImage(myImage)

次のステップ

他の Firebase 機能を使用している場合のアプリのリリース準備方法については、リリース チェックリストをご覧ください。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。