App Flip per Android

Il collegamento App Flip basato su OAuth (App Flip) inserisce la tua app Android nel flusso di collegamento dell'account Google. Un flusso di collegamento dell'account tradizionale richiede che l'utente inserisca le proprie credenziali nel browser. L'uso di App Flip rinvia l'accesso dell'utente alla tua app Android, il che ti consente di sfruttare le autorizzazioni esistenti. Se l'utente ha effettuato l'accesso alla tua app, non è necessario reinserire le credenziali per collegare il proprio account. È necessaria una quantità minima di modifiche al codice per implementare App Flip sulla tua app Android.

In questo documento imparerai come modificare la tua app Android per supportare App Flip.

Prova il campione

Il Flip App collega applicazione di esempio dimostra un account Flip-compatibile App che collega l'integrazione su Android. Puoi utilizzare questa app per verificare come rispondere a un intento di App Flip in arrivo dalle app per dispositivi mobili di Google.

L'applicazione di esempio è preconfigurato per integrarsi con il flip strumento Test App per Android , che può essere utilizzato per verificare l'integrazione della tua app Android con App flip prima di configurare un account di collegamento con Google. Questa app simula l'intento attivato dalle app per dispositivi mobili di Google quando App Flip è abilitato.

Come funziona

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

  1. I controlli app di Google se la vostra applicazione è installato sul dispositivo utilizzando il nome del pacchetto.
  2. L'app Google utilizza un controllo della firma del pacchetto per confermare che l'app installata è l'app corretta.
  3. L'app Google crea l'intento di avviare un'attività designata nella tua app. Questo intento include dati aggiuntivi richiesti per il collegamento. Inoltre, verifica se la tua app supporta App Flip risolvendo questo intento tramite il framework Android.
  4. La tua app conferma che la richiesta proviene dall'app Google. Per fare ciò, la tua app controlla la firma del pacchetto e l'ID client fornito.
  5. La tua app richiede un codice di autorizzazione dal tuo server OAuth 2.0. Alla fine di questo flusso, restituisce un codice di autorizzazione o un errore all'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 di token avviene da server a server, allo stesso modo del flusso di collegamento OAuth basato su browser.

Modifica la tua app Android per supportare App Flip

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

  1. Aggiungere un <intent-filter> al AndroidManifest.xml file con una stringa di azione che corrisponde al valore immesso nel campo intenti 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. Convalida la firma dell'app chiamante.

    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 client dai parametri dell'intento e verifica che l'ID client corrisponda 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. Dopo l'autorizzazione, restituire 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, restituire invece un risultato di errore.

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

Contenuto dell'intento di lancio

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

  • CLIENT_ID ( String ): Google client_id registrato sotto la vostra applicazione.
  • SCOPE ( String[] ): un elenco di ambiti richiesti.
  • REDIRECT_URI ( String ): L'URL di reindirizzamento.

Contenuto dei dati di risposta

I dati restituiti al Google App è impostato nel vostro app chiamando setResult() . Questi dati includono quanto segue:

  • AUTHORIZATION_CODE ( String ): Il valore del codice di autorizzazione.
  • resultCode ( int ): comunica il successo o il fallimento del processo e accetta uno dei seguenti valori:
    • Activity.RESULT_OK : indica il successo; viene restituito un codice di autorizzazione.
    • Activity.RESULT_CANCELLED : I segnali che l'utente ha annullato il processo. In questo caso, l'app Google tenterà di collegare l'account utilizzando l'URL di autorizzazione.
    • -2 : indica che si è verificato un errore. Di seguito vengono descritti diversi tipi di errori.
  • ERROR_TYPE ( int ): Il tipo di errore, che assume uno dei seguenti valori:
    • 1 : errore recuperabile: Google app tenterà conto che collega utilizzando l'URL di autorizzazione.
    • 2 : Errore irreversibile: il Google di interrompere l'app rappresentano il collegamento.
    • 3 : non valido o parametri di richiesta mancanti.
  • ERROR_CODE ( int ): Un numero intero che rappresenta la natura dell'errore. Per visualizzare quali ogni errore mezzi di codice, si riferiscono alla tabella di codici di errore .
  • ERROR_DESCRIPTION ( String , opzionale): messaggio di stato umano leggibile che descrive l'errore.

Un valore per AUTHORIZATION_CODE è previsto quando resultCode == Activity.RESULT_OK . In tutti gli altri casi, il valore di AUTHORIZATION_CODE deve essere vuota. Se resultCode == -2 , allora ERROR_TYPE valore dovrebbe essere popolato.

Tabella dei codici di errore

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

Codice di errore Senso 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, è necessario restituire il risultato di errore tramite setResult per garantire il fallback appropriato trigerred.