Virar app para Android

A vinculação do App Flip com base em OAuth (App Flip) insere seu aplicativo Android no fluxo de vinculação da conta do Google. Um fluxo de vinculação de conta tradicional requer que o usuário insira suas credenciais no navegador. O uso do App Flip adia o login do usuário em seu aplicativo Android, o que permite que você aproveite as autorizações existentes. Se o usuário estiver conectado ao seu aplicativo, ele não precisará inserir novamente suas credenciais para vincular sua conta. Uma quantidade mínima de alterações de código é necessária para implementar o App Flip em seu aplicativo Android.

Neste documento, você aprende como modificar seu aplicativo Android para oferecer suporte ao App Flip.

Experimente a amostra

A Flip App ligando aplicativo de exemplo demonstra uma conta flip-compatível App ligando integração no Android. Você pode usar este aplicativo para verificar como responder a uma intenção do App Flip de entrada dos aplicativos móveis do Google.

O aplicativo de amostra é pré-configurado para se integrar com a App Virar ferramenta de teste para Android , que você pode usar para verificar a integração de seu aplicativo Android com o Google App Virar antes de conta do ligando com o Google. Este aplicativo simula a intenção acionada por aplicativos móveis do Google quando o App Flip está ativado.

Como funciona

As etapas a seguir são necessárias para realizar uma integração com o App Flip:

  1. As verificações de aplicativos do Google se o seu aplicativo está instalado no dispositivo usando seu nome de pacote.
  2. O Google app usa uma verificação de assinatura de pacote para validar se o aplicativo instalado é o correto.
  3. O Google app cria uma intenção de iniciar uma atividade designada em seu aplicativo. Essa intenção inclui dados adicionais necessários para vinculação. Ele também verifica se o seu aplicativo é compatível com o App Flip, resolvendo essa intenção por meio da estrutura do Android.
  4. Seu aplicativo valida que a solicitação está vindo do Google app. Para fazer isso, seu aplicativo verifica a assinatura do pacote e o ID do cliente fornecido.
  5. Seu aplicativo solicita um código de autorização de seu servidor OAuth 2.0. No final desse fluxo, ele retorna um código de autorização ou um erro para o Google app.
  6. O Google app recupera o resultado e continua com a vinculação da conta. Se um código de autorização for fornecido, a troca de token ocorre de servidor para servidor, da mesma forma que acontece no fluxo de vinculação OAuth baseado em navegador.

Modifique seu aplicativo Android para oferecer suporte ao App Flip

Para oferecer suporte ao App Flip, faça as seguintes alterações de código em seu aplicativo Android:

  1. Adicionar um <intent-filter> ao seu AndroidManifest.xml ficheiro com uma sequência de ação que corresponda ao valor inserido no campo Intenção Virar 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. Valide a assinatura do aplicativo de chamada.

    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. Extraia o ID do cliente dos parâmetros de intent e verifique se o ID do cliente corresponde ao valor esperado.

    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. Após a autorização bem-sucedida, devolva o código de autorização resultante ao Google.

    // Successful result
    val data = Intent().apply {
        putExtra("AUTHORIZATION_CODE", authCode)
    }
    setResult(Activity.RESULT_OK, data)
    finish()
    
  5. Se ocorrer um erro, retorne um resultado de erro.

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

Conteúdo da intenção de lançamento

A intenção do Android que inicia seu aplicativo inclui os seguintes campos:

  • CLIENT_ID ( String ): Google client_id registrado sob sua aplicação.
  • SCOPE ( String[] ): Uma lista de escopos solicitados.
  • REDIRECT_URI ( String ): O URL de redirecionamento.

Conteúdo dos dados de resposta

Os dados retornados para o Google App é definido no seu aplicativo chamando setResult() . Esses dados incluem o seguinte:

  • AUTHORIZATION_CODE ( String ): O valor de código de autorização.
  • resultCode ( int ): Comunica o sucesso ou fracasso do processo e assume um dos seguintes valores:
    • Activity.RESULT_OK : Indica sucesso; um código de autorização é retornado.
    • Activity.RESULT_CANCELLED : Sinais de que o usuário cancelou o processo. Nesse caso, o Google app tentará vincular a conta usando seu URL de autorização.
    • -2 : Indica que ocorreu um erro. Diferentes tipos de erros são descritos a seguir.
  • ERROR_TYPE ( int ): O tipo de erro, que tem um dos seguintes valores:
    • 1 : Erro Recuperável: O Google App tentará conta que liga usando o URL de autorização.
    • 2 : Erro irrecuperável: aborts de aplicativos A conta do Google ligando.
    • 3 : inválido ou parâmetros de solicitação em falta.
  • ERROR_CODE ( int ): Um inteiro que representa a natureza do erro. Para ver o que cada erro significa que o código, consulte a tabela de códigos de erro .
  • ERROR_DESCRIPTION ( String , opcional): mensagem de status legível descrevendo o erro.

Um valor para o AUTHORIZATION_CODE é esperado quando resultCode == Activity.RESULT_OK . Em todos os outros casos, o valor para AUTHORIZATION_CODE precisa estar vazio. Se resultCode == -2 , então o ERROR_TYPE valor que é esperado para ser preenchido.

Tabela de códigos de erro

A tabela abaixo mostra os diferentes códigos de erro e se cada um é um erro recuperável ou irrecuperável:

Erro de código Significado Recuperável Irrecuperável
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

Para todos os códigos de erro, você deve devolver o resultado de erro via setResult para garantir o retorno adequado é trigerred.