App Flip na Androida

Łączenie App Flip oparte na protokole OAuth (App Flip) wstawia Twoją aplikację na Androida do procesu łączenia kont Google. Tradycyjny proces łączenia kont wymaga od użytkownika wprowadzenia swoich poświadczeń w przeglądarce. Korzystanie z funkcji App Flip odracza logowanie użytkownika do aplikacji na Androida, co pozwala na wykorzystanie istniejących autoryzacji. Jeśli użytkownik jest zalogowany w Twojej aplikacji, nie musi ponownie wprowadzać swoich danych logowania, aby połączyć swoje konto. Do wdrożenia funkcji App Flip w aplikacji na Androida wymagana jest minimalna ilość zmian w kodzie.

Z tego dokumentu dowiesz się, jak zmodyfikować aplikację na Androida, aby obsługiwała funkcję App Flip.

Wypróbuj próbkę

App Klapki łączące przykładową aplikację wykazuje Klapki kompatybilny konto łączące integrację aplikacji na Androida. Możesz użyć tej aplikacji, aby zweryfikować, jak odpowiedzieć na przychodzącą intencję przerzucenia aplikacji z aplikacji mobilnych Google.

Próbka aplikacja jest wstępnie skonfigurowany do integracji z App Przestawić przełączniki narzędziem testowym dla Android , który można wykorzystać do sprawdzenia Android aplikacji integrację z App Flipa Przed skonfigurowaniem konta powiązanie z Google. Ta aplikacja symuluje zamiar wywołany przez aplikacje mobilne Google, gdy włączona jest funkcja App Flip.

Jak to działa

Do przeprowadzenia integracji App Flip wymagane są następujące kroki:

  1. Kontrole aplikacji Google, czy aplikacja jest zainstalowana na urządzeniu, używając jego nazwy pakietu.
  2. Aplikacja Google używa sprawdzania podpisu pakietu, aby sprawdzić, czy zainstalowana aplikacja jest poprawną aplikacją.
  3. Aplikacja Google tworzy intencję rozpoczęcia wyznaczonej aktywności w Twojej aplikacji. Ta intencja obejmuje dodatkowe dane wymagane do połączenia. Sprawdza również, czy Twoja aplikacja obsługuje funkcję App Flip, rozwiązując tę ​​intencję za pomocą platformy Android.
  4. Twoja aplikacja potwierdza, że ​​żądanie pochodzi z aplikacji Google. Aby to zrobić, Twoja aplikacja sprawdza podpis pakietu i podany identyfikator klienta.
  5. Twoja aplikacja żąda kodu autoryzacyjnego z serwera OAuth 2.0. Na końcu tego przepływu zwraca kod autoryzacji lub błąd do aplikacji Google.
  6. Aplikacja Google pobiera wynik i kontynuuje łączenie kont. Jeśli podano kod autoryzacji, wymiana tokenów odbywa się między serwerami, w taki sam sposób, jak w przepływie łączenia OAuth opartym na przeglądarce.

Zmodyfikuj swoją aplikację na Androida, aby obsługiwała funkcję App Flip

Aby obsługiwać funkcję App Flip, wprowadź następujące zmiany w kodzie aplikacji na Androida:

  1. Dodaj <intent-filter> do AndroidManifest.xml pliku z ciągiem działań, który odpowiada wartość wprowadzoną w polu Intent Flip App.

    <activity android:name="AuthActivity">
      <!-- Handle the app flip intent -->
      <intent-filter>
        <action android:name="INTENT_ACTION_FROM_CONSOLE"/>
        <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
    </activity>
    
  2. Sprawdź poprawność podpisu aplikacji wywołującej.

    private fun verifyFingerprint(
            expectedPackage: String,
            expectedFingerprint: String,
            algorithm: String
    ): Boolean {
    
        callingActivity?.packageName?.let {
            if (expectedPackage == it) {
                val packageInfo =
                    packageManager.getPackageInfo(it, PackageManager.GET_SIGNATURES)
                val signatures = packageInfo.signatures
                val input = ByteArrayInputStream(signatures[0].toByteArray())
    
                val certificateFactory = CertificateFactory.getInstance("X509")
                val certificate =
                    certificateFactory.generateCertificate(input) as X509Certificate
                val md = MessageDigest.getInstance(algorithm)
                val publicKey = md.digest(certificate.encoded)
                val fingerprint = publicKey.joinToString(":") { "%02X".format(it) }
    
                return (expectedFingerprint == fingerprint)
            }
        }
        return false
    }
    
  3. Wyodrębnij identyfikator klienta z parametrów intencji i sprawdź, czy identyfikator klienta odpowiada oczekiwanej wartości.

    private const val EXPECTED_CLIENT = "<client-id-from-actions-console>"
    private const val EXPECTED_PACKAGE = "<google-app-package-name>"
    private const val EXPECTED_FINGERPRINT = "<google-app-signature>"
    private const val ALGORITHM = "SHA-256"
    ...
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        val clientId = intent.getStringExtra("CLIENT_ID")
    
        if (clientId == EXPECTED_CLIENT &&
            verifyFingerprint(EXPECTED_PACKAGE, EXPECTED_FINGERPRINT, ALGORITHM)) {
    
            // ...authorize the user...
        }
    }
    
  4. Po pomyślnej autoryzacji zwróć otrzymany kod autoryzacyjny do Google.

    // Successful result
    val data = Intent().apply {
        putExtra("AUTHORIZATION_CODE", authCode)
    }
    setResult(Activity.RESULT_OK, data)
    finish()
    
  5. Jeśli wystąpił błąd, zamiast tego zwróć wynik błędu.

    // Error result
    val error = Intent().apply {
        putExtra("ERROR_TYPE", 1)
        putExtra("ERROR_CODE", 1)
        putExtra("ERROR_DESCRIPTION", "Invalid Request")
    }
    setResult(-2, error)
    finish()
    

Treść intencji uruchomienia

Intencja Androida, która uruchamia Twoją aplikację, zawiera następujące pola:

  • CLIENT_ID ( String ): Google client_id zarejestrowana pod aplikacji.
  • SCOPE ( String[] ): Wykaz wymaganych zakresów.
  • REDIRECT_URI ( String ): Przekierowanie URL.

Treść danych odpowiedzi

Dane zwracane do aplikacji Google jest ustawione w aplikacji poprzez wywołanie setResult() . Dane te obejmują:

  • AUTHORIZATION_CODE ( String ): Wartość kodu autoryzacji.
  • resultCode ( int ): komunikuje sukces lub porażka procesu i ma jedną z następujących wartości:
    • Activity.RESULT_OK : Wskazuje sukces; zwracany jest kod autoryzacyjny.
    • Activity.RESULT_CANCELLED : Sygnały, że użytkownik anulował proces. W takim przypadku aplikacja Google spróbuje połączyć konto przy użyciu adresu URL autoryzacji.
    • -2 : wskazuje, że wystąpił błąd. Poniżej opisano różne rodzaje błędów.
  • ERROR_TYPE ( int ): typ błędu, który ma jedną z następujących wartości:
    • 1 : odwracalnego błędu: Google aplikacja będzie próbować konto łączącą za pomocą adresu URL autoryzacji.
    • 2 : Nieodwracalne błąd: Przerywa app konta Google, łącząc.
    • 3 : Nieprawidłowe lub brakujące parametry żądania.
  • ERROR_CODE ( int ): całkowita reprezentująca naturę błędu. Aby zobaczyć, co każdy błąd oznacza kod, patrz tabela kodów błędów .
  • ERROR_DESCRIPTION ( String , opcjonalnie): Human-czytelny komunikat statusu opisujący błąd.

Wartość dla AUTHORIZATION_CODE Oczekuje się, gdy resultCode == Activity.RESULT_OK . We wszystkich pozostałych przypadkach, wartość AUTHORIZATION_CODE musi być pusty. Jeśli resultCode == -2 , wówczas ERROR_TYPE ma być wypełniona wartość.

Tabela kodów błędów

W poniższej tabeli przedstawiono różne kody błędów oraz to, czy każdy z nich jest błędem możliwym do naprawienia, czy nieodwracalnym:

Kod błędu Oznaczający Odzyskiwalne Nie do odzyskania
1 INVALID_REQUEST
2 NO_INTERNET_CONNECTION
3 OFFLINE_MODE_ACTIVE
4 CONNECTION_TIMEOUT
5 INTERNAL_ERROR
6 AUTHENTICATION_SERVICE_UNAVAILABLE
8 CLIENT_VERIFICATION_FAILED
9 INVALID_CLIENT
10 INVALID_APP_ID
11 INVALID_REQUEST
12 AUTHENTICATION_SERVICE_UNKNOWN_ERROR
13 AUTHENTICATION_DENIED_BY_USER
14 CANCELLED_BY_USER
15 FAILURE_OTHER
16 USER_AUTHENTICATION_FAILED

Dla wszystkich kodów błędów, należy zwrócić wynik błędu poprzez setResult aby zapewnić odpowiedni awaryjna jest trigerred.