App-Flip für Android

Die OAuth-basierte App Flip-Verknüpfung (App Flip) fügt Ihre Android-App in den Google-Kontoverknüpfungsablauf ein. Bei einer herkömmlichen Kontoverknüpfung muss der Benutzer seine Anmeldeinformationen im Browser eingeben. Die Verwendung von App Flip verschiebt die Benutzeranmeldung bei Ihrer Android-App, wodurch Sie vorhandene Autorisierungen nutzen können. Wenn der Benutzer bei Ihrer App angemeldet ist, muss er seine Anmeldeinformationen nicht erneut eingeben, um sein Konto zu verknüpfen. Es sind nur minimale Codeänderungen erforderlich, um App Flip in Ihrer Android-App zu implementieren.

In diesem Dokument erfahren Sie, wie Sie Ihre Android-App so ändern, dass sie App Flip unterstützt.

Probieren Sie die Probe aus

Die App Flip Verknüpfung Beispielanwendung zeigt ein App Flip-kompatible Konto verknüpfen Integration auf Android. Sie können diese App verwenden, um zu überprüfen, wie Sie auf einen eingehenden App Flip-Intent von mobilen Google-Apps reagieren.

Die Beispielanwendung ist so vorkonfiguriert , mit dem integrieren App Flip Test Tool für Android , mit dem Sie Ihre Android - App-Integration in App Flip verwenden können , um zu überprüfen , bevor Sie configure mit Google - Konto verknüpfen. Diese App simuliert die Absicht, die von mobilen Google-Apps ausgelöst wird, wenn App Flip aktiviert ist.

Wie es funktioniert

Um eine App Flip-Integration durchzuführen, sind folgende Schritte erforderlich:

  1. Die Google App überprüft , ob Ihre App auf dem Gerät installiert seine Paketnamen verwenden.
  2. Die Google-App verwendet eine Paketsignaturprüfung, um zu überprüfen, ob es sich bei der installierten App um die richtige App handelt.
  3. Die Google-App erstellt einen Intent, um eine bestimmte Aktivität in Ihrer App zu starten. Dieser Intent enthält zusätzliche Daten, die für die Verlinkung erforderlich sind. Es überprüft auch, ob Ihre App App Flip unterstützt, indem diese Absicht über das Android-Framework aufgelöst wird.
  4. Ihre App bestätigt, dass die Anfrage von der Google-App stammt. Dazu überprüft Ihre App die Paketsignatur und die bereitgestellte Client-ID.
  5. Ihre App fordert einen Autorisierungscode von Ihrem OAuth 2.0-Server an. Am Ende dieses Ablaufs wird entweder ein Autorisierungscode oder ein Fehler an die Google-App zurückgegeben.
  6. Die Google-App ruft das Ergebnis ab und fährt mit der Kontoverknüpfung fort. Wenn ein Autorisierungscode bereitgestellt wird, erfolgt der Token-Austausch von Server zu Server, genauso wie beim browserbasierten OAuth-Verknüpfungsfluss.

Ändern Sie Ihre Android-App, um App Flip zu unterstützen

Um App Flip zu unterstützen, nehmen Sie die folgenden Codeänderungen an Ihrer Android-App vor:

  1. Fügen Sie ein <intent-filter> auf Ihre AndroidManifest.xml Datei mit einer Aktion String, der den Wert entspricht , die Sie in der App Flip Intent Feld eingetragen.

    <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. Überprüfen Sie die Signatur der aufrufenden App.

    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. Extrahieren Sie die Client-ID aus den Absichtsparametern und überprüfen Sie, ob die Client-ID mit dem erwarteten Wert übereinstimmt.

    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. Senden Sie nach erfolgreicher Autorisierung den resultierenden Autorisierungscode an Google zurück.

    // Successful result
    val data = Intent().apply {
        putExtra("AUTHORIZATION_CODE", authCode)
    }
    setResult(Activity.RESULT_OK, data)
    finish()
    
  5. Wenn ein Fehler aufgetreten ist, geben Sie stattdessen ein Fehlerergebnis zurück.

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

Inhalt der Startabsicht

Der Android-Intent, der Ihre App startet, umfasst die folgenden Felder:

  • CLIENT_ID ( String ): Google client_id unter Ihrer App registriert.
  • SCOPE ( String[] ): Eine Liste von Bereichen angefordert.
  • REDIRECT_URI ( String ): Die URL - Weiterleitung.

Inhalt der Antwortdaten

Die Daten der Google App zurückgegeben wird , in Ihrer Anwendung festgelegt durch den Aufruf setResult() . Diese Daten umfassen Folgendes:

  • AUTHORIZATION_CODE ( String ): Der Autorisierungscode Wert.
  • resultCode ( int ): Kommuniziert der Erfolg oder Misserfolg des Prozesses und nimmt einen der folgenden Werte:
    • Activity.RESULT_OK : Zeigt Erfolg; ein Autorisierungscode wird zurückgegeben.
    • Activity.RESULT_CANCELLED : Signale , dass der Benutzer den Vorgang abgebrochen hat. In diesem Fall versucht die Google App, das Konto mit Ihrer Autorisierungs-URL zu verknüpfen.
    • -2 : Gibt an, dass ein Fehler aufgetreten ist. Nachfolgend werden verschiedene Arten von Fehlern beschrieben.
  • ERROR_TYPE ( int ): Die Art des Fehlers, die einen der folgenden Werte annehmen:
    • 1 : Behebbarer Fehler: Die Google - App - Konto versuchen wird , die Bindung der Zulassung URL.
    • 2 : Nicht behebbarer Fehler: Die Google App Abbrüche Konto verknüpfen.
    • 3 : Ungültige oder fehlende Anforderungsparameter.
  • ERROR_CODE ( int ): Eine ganze Zahl , die Art des Fehlers darstellt. Um zu sehen , was jedes Fehlercodemittel finden Sie in die Tabelle des Fehlercodes .
  • ERROR_DESCRIPTION ( String , optional): Menschen lesbare Statusmeldung der den Fehler beschreibt.

Ein Wert für die AUTHORIZATION_CODE wird erwartet , wenn resultCode == Activity.RESULT_OK . In allen anderen Fällen ist der Wert für AUTHORIZATION_CODE muss leer sein. Wenn resultCode == -2 , dann wird der ERROR_TYPE wird Wert erwartet gefüllt werden.

Tabelle der Fehlercodes

Die folgende Tabelle zeigt die verschiedenen Fehlercodes und ob es sich um einen behebbaren oder nicht behebbaren Fehler handelt:

Fehlercode Bedeutung Wiederherstellbar Nicht wiederherstellbar
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

Für alle Fehlercodes, müssen Sie das Fehlerergebnis über das Rück setResult die entsprechende Ausweich wird trigerred zu gewährleisten.