App Flip untuk Android

Penautan Balik Aplikasi berbasis OAuth (App Flip) akan menyisipkan aplikasi Android Anda ke dalam Alur Penautan Akun Google. Alur penautan akun tradisional memerlukan pengguna untuk memasukkan kredensial mereka di {i>browser<i}. Penggunaan App Flip menunda status pengguna masuk ke aplikasi Android Anda, yang memungkinkan Anda memanfaatkan otorisasi baru. Jika pengguna login ke aplikasi, mereka tidak perlu memasukkan kembali kredensial mereka untuk menautkan akun mereka. Jumlah kode minimal perubahan diperlukan untuk menerapkan Balik Aplikasi di aplikasi Android Anda.

Dalam dokumen ini, Anda akan mempelajari cara memodifikasi aplikasi Android untuk mendukung Balik Aplikasi.

Coba sampel

Aplikasi contoh penautan App Flip menunjukkan integrasi penautan akun yang kompatibel dengan Flip Aplikasi di Android. Anda dapat menggunakan aplikasi ini untuk memverifikasi cara merespons intent Balik Aplikasi yang masuk dari Aplikasi seluler Google.

Aplikasi contoh telah dikonfigurasi sebelumnya untuk berintegrasi dengan Alat Pengujian Balik Aplikasi untuk Android, yang dapat Anda gunakan untuk memverifikasi integrasi aplikasi Android dengan App Balik sebelum Anda mengonfigurasi penautan akun dengan Google. Aplikasi ini menyimulasikan yang dipicu oleh aplikasi seluler Google saat App Flip diaktifkan.

Cara kerjanya

Langkah-langkah berikut diperlukan untuk melakukan integrasi App Flip:

  1. Aplikasi Google memeriksa apakah aplikasi Anda telah diinstal di perangkat menggunakan nama paket.
  2. Aplikasi Google menggunakan pemeriksaan tanda tangan paket untuk memvalidasi bahwa aplikasi adalah aplikasi yang benar.
  3. Aplikasi Google membuat intent untuk memulai aktivitas yang ditetapkan di aplikasi Anda. Intent ini menyertakan data tambahan yang diperlukan untuk penautan. Halaman ini juga memeriksa untuk melihat apakah aplikasi Anda mendukung App Flip dengan menyelesaikan intent ini melalui framework Android.
  4. Aplikasi Anda memvalidasi bahwa permintaan berasal dari aplikasi Google. Untuk melakukannya, aplikasi Anda akan memeriksa tanda tangan paket dan ID klien yang diberikan.
  5. Aplikasi Anda meminta kode otorisasi dari server OAuth 2.0. Di akhir alur ini, ia mengembalikan kode otorisasi atau kesalahan ke Aplikasi Google.
  6. Aplikasi Google akan mengambil hasil dan melanjutkan dengan penautan akun. Jika kode otorisasi diberikan, pertukaran token terjadi server ke server, dengan cara yang sama seperti yang dilakukan dalam penautan OAuth berbasis browser alur kerja.

Memodifikasi aplikasi Android untuk mendukung App Flip

Untuk mendukung App Flip, buat perubahan kode berikut pada aplikasi Android Anda:

  1. Tambahkan <intent-filter> ke file AndroidManifest.xml Anda dengan tindakan string yang cocok dengan nilai yang Anda masukkan di kolom Intent Balik Aplikasi.

    <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. Validasi tanda tangan aplikasi pemanggil.

    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. Ekstrak client ID dari parameter intent dan verifikasi bahwa klien ID cocok dengan nilai yang diharapkan.

    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. Setelah otorisasi berhasil, kembalikan kode otorisasi yang dihasilkan ke Google.

    // Successful result
    val data = Intent().apply {
        putExtra("AUTHORIZATION_CODE", authCode)
    }
    setResult(Activity.RESULT_OK, data)
    finish()
    
  5. Jika terjadi error, tampilkan hasil error.

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

Konten intent peluncuran

Intent Android yang meluncurkan aplikasi Anda menyertakan kolom berikut:

  • CLIENT_ID (String): Google client_id yang terdaftar menggunakan aplikasi Anda.
  • SCOPE (String[]): Daftar cakupan yang diminta.
  • REDIRECT_URI (String): URL alihan.

Konten data respons

Data yang ditampilkan ke aplikasi Google disetel di aplikasi Anda dengan memanggil setResult(). Data ini meliputi:

  • AUTHORIZATION_CODE (String): Nilai kode otorisasi.
  • resultCode (int): Menyampaikan keberhasilan atau kegagalan proses dan menggunakan salah satu nilai berikut:
    • Activity.RESULT_OK: Menunjukkan keberhasilan; kode otorisasi ditampilkan.
    • Activity.RESULT_CANCELLED: Sinyal bahwa pengguna telah membatalkan {i>checkout<i}. Dalam hal ini, aplikasi Google akan mencoba penautan akun menggunakan URL otorisasi Anda.
    • -2: Menunjukkan bahwa telah terjadi error. Berbagai jenis kesalahan dijelaskan di bawah ini.
  • ERROR_TYPE (int): Jenis error, yang menggunakan salah satu dari hal berikut nilai-nilai:
    • 1: Error yang dapat dipulihkan: Aplikasi Google akan mencoba penautan akun menggunakan URL otorisasi.
    • 2: Error yang tidak dapat dipulihkan: Aplikasi Google membatalkan penautan akun.
    • 3: Parameter permintaan tidak valid atau tidak ada.
  • ERROR_CODE (int): Bilangan bulat yang mewakili sifat error. Untuk melihat arti dari setiap kode error, lihat tabel kode error.
  • ERROR_DESCRIPTION (String, opsional): Pesan status yang dapat dibaca manusia menjelaskan error.

Nilai untuk AUTHORIZATION_CODE diharapkan jika resultCode == Activity.RESULT_OK. Dalam semua kasus lain, nilai untuk AUTHORIZATION_CODE harus kosong. Jika resultCode == -2, maka Nilai ERROR_TYPE diharapkan sudah diisi.

Tabel kode error

Tabel di bawah ini menunjukkan berbagai kode error dan apakah masing-masing kode merupakan error yang dapat dipulihkan atau tidak dapat dipulihkan:

Kode error Arti Dapat dipulihkan Tidak dapat dipulihkan
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

Untuk semua kode error, Anda harus menampilkan hasil error melalui setResult ke memastikan penggantian yang sesuai diprioritaskan.