App-Flip für Android

OAuth-basierte App-Flip-Verknüpfung (App Flip) fügt Ihre Android-App in den Ablauf der Google-Kontoverknüpfung. Bei einem herkömmlichen Kontoverknüpfungsvorgang ist das Nutzer, ihre Anmeldedaten im Browser einzugeben. Die Verwendung von App Flip verzögert melden Sie sich in Ihrer Android-App an, um Autorisierungen. Wenn der Nutzer in Ihrer App angemeldet ist, muss er ihre Anmeldedaten noch einmal eingeben, um ihr Konto zu verknüpfen. Wenig Code Änderungen sind erforderlich, um App-Flip in deiner Android-App zu implementieren.

In diesem Dokument erfahren Sie, wie Sie Ihre Android-App so anpassen, dass sie App-Flip.

Beispiel ausprobieren

App-Flip-Verknüpfung der Beispiel-App zeigt eine mit App Flip kompatible Kontoverknüpfung auf Android. Ich kann mit dieser App prüfen, wie auf einen eingehenden App-Flip-Intent von Mobile Google-Apps

Die Beispiel-App ist für die Integration in das App-Flip-Testtool für Android-Geräte mit dem du die Integration deiner Android-App in die App prüfen kannst Umdrehen, bevor du die Kontoverknüpfung mit Google konfigurierst. Diese App simuliert den Intent, der von mobilen Google-Apps ausgelöst wird, wenn App Flip aktiviert ist.

Funktionsweise

Für eine App-Flip-Integration sind die folgenden Schritte erforderlich:

  1. Die Google App prüft mithilfe der Paketname.
  2. Die Google App prüft mithilfe einer Paketsignatur, ob die installierte App App die richtige App ist.
  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 Verknüpfung erforderlich sind. Außerdem wird geprüft, um zu sehen, ob deine App App Flip unterstützt, indem du diesen Intent über die Android-Framework.
  4. Ihre App prüft, ob die Anfrage von der Google App stammt. Gehen Sie dazu wie folgt vor: Ihre App prüft die Paketsignatur und die angegebene Client-ID.
  5. Ihre Anwendung fordert einen Autorisierungscode von Ihrem OAuth 2.0-Server an. Im am Ende dieses Vorgangs gibt es entweder einen Autorisierungscode oder einen Fehler an den Google App.
  6. Die Google App ruft das Ergebnis ab und fährt mit der Kontoverknüpfung fort. Wenn wird ein Autorisierungscode angegeben, wird der Token ausgetauscht Server-zu-Server, wie bei der browserbasierten OAuth-Verknüpfung Ablauf.

Ändere deine Android-App, damit sie App Flip unterstützt

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

  1. AndroidManifest.xml-Datei mit einer Aktion einen <intent-filter> hinzufügen String, der dem Wert entspricht, den Sie im Feld App Flip Intent eingegeben haben.

    <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. Validiert die Signatur der aufrufenden App.

    <ph type="x-smartling-placeholder">
    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 Intent-Parametern und prüfen Sie, ob der Client ID entspricht dem erwarteten Wert.

    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. Rückgabe des resultierenden Autorisierungscodes nach erfolgreicher Autorisierung an Google senden.

    // 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 Launch-Intent

Der Android-Intent, mit dem Ihre App gestartet wird, enthält die folgenden Felder:

  • CLIENT_ID (String): Google client_id wurde unter deiner App registriert.
  • SCOPE (String[]): Eine Liste der angeforderten Bereiche.
  • REDIRECT_URI (String): Die Weiterleitungs-URL.

Inhalt der Antwortdaten

Die an die Google App zurückgegebenen Daten werden in Ihrer App festgelegt, indem setResult() aufgerufen wird. Diese Daten umfassen Folgendes:

  • AUTHORIZATION_CODE (String): Der Wert des Autorisierungscodes.
  • resultCode (int): Kommuniziert den Erfolg oder Misserfolg des Prozesses und enthält einen der folgenden Werte: <ph type="x-smartling-placeholder">
      </ph>
    • Activity.RESULT_OK: Zeigt an, dass der Vorgang erfolgreich war. wird ein Autorisierungscode zurückgegeben.
    • Activity.RESULT_CANCELLED: Signalisiert, dass der Nutzer das . In diesem Fall versucht die Google App, die Kontoverknüpfung mit Ihre Autorisierungs-URL.
    • -2: Gibt an, dass ein Fehler aufgetreten ist. Verschiedene Arten von Fehlern werden im Folgenden beschrieben.
  • ERROR_TYPE (int): Der Fehlertyp mit einem der folgenden Werte. Werte: <ph type="x-smartling-placeholder">
      </ph>
    • 1: Behebbarer Fehler: Die Google App versucht, die Kontoverknüpfung mit Autorisierungs-URL
    • 2: Nicht behebbarer Fehler: Die Kontoverknüpfung wird in der Google App abgebrochen.
    • 3: Anfrageparameter sind ungültig oder fehlen.
  • ERROR_CODE (int): Eine Ganzzahl, die die Art des Fehlers darstellt. Um zu sehen, Informationen zur Bedeutung der einzelnen Fehlercodes finden Sie in der Tabelle mit Fehlercodes an.
  • ERROR_DESCRIPTION (String, optional): visuell lesbare Statusmeldung um den Fehler zu beschreiben.

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

Tabelle mit Fehlercodes

In der folgenden Tabelle sind die verschiedenen Fehlercodes aufgeführt und es wird angegeben, ob es sich jeweils um einen behebbaren oder nicht behebbaren Fehler handelt:

Fehlercode Bedeutung Wiederherstellbar Uneinbringlich
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 setResult an um sicherzustellen, dass das entsprechende Fallback ausgelöst wird.