App Flip per Android

Il collegamento App Flip basato su OAuth (App Flip) inserisce la tua app Android nella Flusso di collegamento dell'Account Google. Un flusso di collegamento dell'account tradizionale richiede all'utente di inserire le proprie credenziali nel browser. L'utilizzo di App Flip rinvia l'utente accedere alla tua app per Android, il che ti consente di sfruttare i vantaggi autorizzazioni. Se l'utente ha eseguito l'accesso alla tua app, non deve effettuare inserire nuovamente le credenziali per collegare l'account. Una quantità minima di codice per implementare App Flip nella tua app per Android.

In questo documento imparerai a modificare l'app per Android per supportare App Flip.

Prova l'esempio

L'app App Flip che collega l'app di esempio dimostra un'integrazione di collegamento dell'account compatibile con App Flip su Android. Tu puoi usare questa app per verificare come rispondere a un intent App Flip in arrivo da App mobile Google.

L'app di esempio è preconfigurata per l'integrazione con l'App Flip Test Tool per Android, che puoi usare per verificare l'integrazione della tua app Android con l'app Capovolgi prima di configurare il collegamento dell'account con Google. Questa app simula intent attivato dalle app mobile Google quando App Flip è attivata.

Come funziona

Per eseguire un'integrazione App Flip, sono necessari i seguenti passaggi:

  1. L'app Google controlla se la tua app è installata sul dispositivo utilizzando la sua nome del pacchetto.
  2. L'app Google utilizza un controllo della firma del pacchetto per confermare che l'app è installata sia quella corretta.
  3. L'app Google crea un intent per avviare un'attività designata nella tua app. Questo intent include dati aggiuntivi richiesti per il collegamento. Inoltre, controlla per vedere se la tua app supporta App Flip risolvendo questo intent tramite Framework Android.
  4. La tua app verifica che la richiesta provenga dall'app Google. Per farlo, la tua app controlla la firma del pacchetto e l'ID client fornito.
  5. L'app richiede un codice di autorizzazione al server OAuth 2.0. Al al termine di questo flusso, restituisce un codice di autorizzazione o un errore App Google.
  6. L'app Google recupera il risultato e continua con il collegamento dell'account. Se viene fornito un codice di autorizzazione, lo scambio del token avviene server-to-server, proprio come nel collegamento OAuth basato su browser flusso di lavoro.

Modifica la tua app per Android affinché supporti App Flip

Per supportare App Flip, apporta le seguenti modifiche al codice della tua app per Android:

  1. Aggiungi <intent-filter> al file AndroidManifest.xml con un'azione corrispondente al valore inserito nel campo App Flip Intent.

    <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. Convalida la firma dell'app per la chiamata.

    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. Estrai l'ID cliente dai parametri per intent e verifica che il cliente L'ID corrisponde al valore previsto.

    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. Una volta ottenuta l'autorizzazione, restituisci il codice di autorizzazione risultante a Google.

    // Successful result
    val data = Intent().apply {
        putExtra("AUTHORIZATION_CODE", authCode)
    }
    setResult(Activity.RESULT_OK, data)
    finish()
    
  5. Se si è verificato un errore, restituiscine il risultato.

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

Contenuti dell'intenzione di lancio

L'intent Android che avvia la tua app include i seguenti campi:

  • CLIENT_ID (String): Google client_id registrato nella tua app.
  • SCOPE (String[]): un elenco degli ambiti richiesti.
  • REDIRECT_URI (String): l'URL di reindirizzamento.

Contenuto dei dati della risposta

I dati restituiti all'app Google vengono impostati nella tua app chiamando setResult(). Questi dati includono:

  • AUTHORIZATION_CODE (String): il valore del codice di autorizzazione.
  • resultCode (int): comunica lo stato di esito positivo o negativo del processo e assume uno dei seguenti valori:
      .
    • Activity.RESULT_OK: indica l'esito positivo; viene restituito un codice di autorizzazione.
    • Activity.RESULT_CANCELLED: segnala che l'utente ha annullato l' e il processo di sviluppo. In questo caso, l'app Google tenterà di collegare l'account utilizzando l'URL di autorizzazione.
    • -2: indica che si è verificato un errore. Diversi tipi di errori sono descritti di seguito.
  • ERROR_TYPE (int): il tipo di errore, che richiede uno dei seguenti valori: valori:
      .
    • 1: errore recuperabile: l'app Google tenterà di collegare l'account utilizzando l'URL di autorizzazione.
    • 2: errore irreversibile: l'app Google interrompe il collegamento dell'account.
    • 3: parametri della richiesta non validi o mancanti.
  • ERROR_CODE (int): un numero intero che rappresenta la natura dell'errore. Per vedere il significato di ogni codice di errore, fai riferimento alle tabella dei codici di errore.
  • ERROR_DESCRIPTION (String, facoltativo): messaggio di stato leggibile che descrive l'errore.

È previsto un valore per AUTHORIZATION_CODE quando resultCode == Activity.RESULT_OK. In tutti gli altri casi, il valore per Il campo AUTHORIZATION_CODE deve essere vuoto. Se resultCode == -2, allora Si prevede che il valore ERROR_TYPE verrà compilato.

Tabella dei codici di errore

La tabella seguente mostra i diversi codici di errore e indica se ciascuno è un errore recuperabile o irreversibile:

Codice di errore Significato Recuperabile Non recuperabile
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

Per tutti i codici di errore, devi restituire il risultato dell'errore tramite setResult a garantire che venga selezionato il fallback appropriato.