Ochrona danych logowania do aplikacji Firebase ML na Androida

Jeśli Twoja aplikacja na Androida używa jednego z interfejsów API w chmurze Firebase ML, przed opublikowaniem aplikacji w wersji produkcyjnej należy wykonać dodatkowe czynności, aby zapobiec nieautoryzowanemu dostępowi do interfejsu API.

W przypadku aplikacji produkcyjnych masz pewność, że do usług w chmurze mają dostęp tylko uwierzytelnione klienty. (Pamiętaj, że tylko urządzenia bez dostępu do roota mogą uwierzytelniać się przy użyciu opisanej metody).

Następnie utworzysz klucz interfejsu API przeznaczony tylko do debugowania, którego możesz używać podczas testowania i programowania.

1. Rejestrowanie produkcyjnych aplikacji w Firebase

Najpierw zarejestruj aplikacje w wersji produkcyjnej w Firebase.

  1. Sprawdź, czy masz podpisy SHA-1 aplikacji. Więcej informacji znajdziesz w artykule Uwierzytelnianie klienta.

  2. Otwórz Ustawienia projektu w konsoli Firebase, a potem wybierz kartę Ustawienia.

  3. Przewiń w dół do karty Twoje aplikacje i wybierz swoją aplikację na Androida.

  4. Dodaj podpis SHA-1 do informacji o aplikacji.

2. Ograniczanie zakresu kluczy interfejsu API

Następnie skonfiguruj istniejące klucze interfejsu API, aby zablokować dostęp do interfejsu Cloud Vision API:

  1. Otwórz stronę Dane logowania w konsoli Google Cloud. Gdy pojawi się taka prośba, wybierz projekt.

  2. Dla każdego klucza interfejsu API występującego na liście otwórz widok edycji.

  3. W sekcji Ograniczenia interfejsów API wybierz Ogranicz klucz, a następnie dodaj do listy wszystkie interfejsy API, do których klucz interfejsu API ma mieć dostęp. Pamiętaj, aby nie zawierać interfejsu Cloud Vision API.

    Konfigurując ograniczenia interfejsu API klucza interfejsu API, tworzysz jawnie zadeklarowane interfejsy API, do których ten klucz ma dostęp. Domyślnie, gdy w sekcji Ograniczenia interfejsu API wybrana jest opcja Nie ograniczaj klucza, za pomocą klucza interfejsu API można uzyskać dostęp do dowolnego interfejsu API włączonego w projekcie.

Teraz Twoje istniejące klucze interfejsu API nie będą przyznawać dostępu do usług w chmurze, ale każdy klucz będzie nadal działać ze wszystkimi interfejsami API dodanymi do ich listy ograniczeń interfejsów API.

Pamiętaj, że jeśli w przyszłości włączysz dodatkowe interfejsy API, musisz je dodać do listy Ograniczenia interfejsów API dla odpowiedniego klucza interfejsu API.

3. Tworzenie i używanie klucza interfejsu API przeznaczonego tylko do debugowania

Na koniec utwórz nowy klucz interfejsu API, który będzie używany tylko na potrzeby programowania. Systemy uczące się Firebase mogą używać tego klucza interfejsu API, aby uzyskiwać dostęp do usług Google Cloud w środowiskach, w których uwierzytelnianie aplikacji nie jest możliwe, np. w przypadku działania w emulatorach.

  1. Utwórz nowy klucz interfejsu API na potrzeby programowania:

    1. Otwórz stronę Dane logowania w konsoli Google Cloud. Gdy pojawi się taka prośba, wybierz projekt.

    2. Kliknij Utwórz dane logowania > Klucz interfejsu API i zanotuj nowy klucz interfejsu API. Ten klucz umożliwia dostęp przez interfejs API z nieuwierzytelnionych aplikacji, dlatego zachowaj go jako poufny.

  2. Aby mieć pewność, że nowy klucz interfejsu API debugowania nie wycieknie z opublikowaną aplikacją, określ go w pliku manifestu Androida, który będzie używany tylko do debugowania kompilacji:

    1. Jeśli nie masz jeszcze pliku manifestu debugowania, utwórz go. W tym celu kliknij Plik > Nowy > Inne > Plik manifestu Androida i wybierz debug ze zbiorów źródeł docelowych.

    2. W pliku manifestu debugowania dodaj tę deklarację:

      <application>
      <meta-data
          android:name="com.firebase.ml.cloud.ApiKeyForDebug"
          android:value="your-debug-api-key" />
      </application>
      
  3. W swojej aplikacji skonfiguruj system ML Firebase tak, aby używał dopasowywania odcisków cyfrowych certyfikatów do uwierzytelniania klienta w środowisku produkcyjnym i używać kluczy interfejsu API (klucza debugowania) tylko w kompilacjach do debugowania:

    Kotlin+KTX

    val optionsBuilder = FirebaseVisionCloudImageLabelerOptions.Builder()
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch()
    }
    
    // Set other options. For example:
    optionsBuilder.setConfidenceThreshold(0.8f)
    // ...
    
    // And lastly:
    val options = optionsBuilder.build()
    FirebaseVision.getInstance().getCloudImageLabeler(options).processImage(myImage)

    Java

    FirebaseVisionCloudImageLabelerOptions.Builder optionsBuilder =
            new FirebaseVisionCloudImageLabelerOptions.Builder();
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch();
    }
    
    // Set other options. For example:
    optionsBuilder.setConfidenceThreshold(0.8f);
    // ...
    
    // And lastly:
    FirebaseVisionCloudImageLabelerOptions options = optionsBuilder.build();
    FirebaseVision.getInstance().getCloudImageLabeler(options).processImage(myImage);

Dalsze kroki

Zapoznaj się z listą kontrolną uruchamiania, aby dowiedzieć się, jak przygotować aplikację do wprowadzenia na rynek, korzystając z innych funkcji Firebase.