Balik Aplikasi untuk Android

Penautan Flip Aplikasi berbasis OAuth (App Flip) memasukkan aplikasi Android Anda ke dalam alur Penautan Akun Google. Alur penautan akun tradisional mengharuskan pengguna memasukkan kredensial mereka di browser. Penggunaan App Flip menunda proses masuk pengguna ke aplikasi Android Anda, yang memungkinkan Anda memanfaatkan otorisasi yang ada. Jika pengguna masuk ke aplikasi Anda, mereka tidak perlu memasukkan kembali kredensial mereka untuk menautkan akun mereka. Sedikit perubahan kode diperlukan untuk mengimplementasikan App Flip di aplikasi Android Anda.

Dalam dokumen ini, Anda mempelajari cara memodifikasi aplikasi Android Anda untuk mendukung App Flip.

Coba sampelnya

App Balik menghubungkan aplikasi sampel menunjukkan sebuah App Balik-kompatibel akun menghubungkan integrasi pada Android. Anda dapat menggunakan aplikasi ini untuk memverifikasi cara merespons maksud App Flip yang masuk dari aplikasi seluler Google.

Aplikasi sampel telah dikonfigurasikan untuk mengintegrasikan dengan App Balik Uji Alat untuk Android , yang dapat Anda gunakan untuk memverifikasi integrasi aplikasi Android Anda dengan App Balik sebelum Anda mengkonfigurasi akun menghubungkan dengan Google. Aplikasi ini mensimulasikan maksud yang dipicu oleh aplikasi seluler Google saat App Flip diaktifkan.

Bagaimana itu bekerja

Langkah-langkah berikut diperlukan untuk melakukan integrasi App Flip:

  1. Cek aplikasi Google jika aplikasi Anda diinstal pada perangkat menggunakan nama kemasannya.
  2. Aplikasi Google menggunakan pemeriksaan tanda tangan paket untuk memvalidasi bahwa aplikasi yang diinstal adalah aplikasi yang benar.
  3. Google app membuat maksud untuk memulai aktivitas yang ditentukan di aplikasi Anda. Intent ini mencakup data tambahan yang diperlukan untuk penautan. Ini juga memeriksa untuk melihat apakah aplikasi Anda mendukung App Flip dengan menyelesaikan maksud ini melalui kerangka kerja Android.
  4. Aplikasi Anda memvalidasi bahwa permintaan tersebut berasal dari Google app. Untuk melakukannya, aplikasi Anda memeriksa tanda tangan paket dan ID klien yang diberikan.
  5. Aplikasi Anda meminta kode otorisasi dari server OAuth 2.0 Anda. Di akhir alur ini, ini mengembalikan kode otorisasi atau kesalahan ke Google app.
  6. Google app mengambil hasilnya dan melanjutkan dengan penautan akun. Jika kode otorisasi diberikan, pertukaran token terjadi antar server, dengan cara yang sama seperti yang terjadi pada alur penautan OAuth berbasis browser.

Ubah aplikasi Android Anda untuk mendukung App Flip

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

  1. Tambahkan <intent-filter> untuk Anda AndroidManifest.xml berkas dengan string tindakan yang cocok dengan nilai yang dimasukkan di bidang Intent 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. Validasi tanda tangan aplikasi panggilan.

    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 ID klien dari parameter maksud dan verifikasi bahwa ID klien 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 kesalahan, kembalikan hasil kesalahan.

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

Isi dari maksud peluncuran

Maksud Android yang meluncurkan aplikasi Anda mencakup bidang berikut:

  • CLIENT_ID ( String ): Google client_id terdaftar di bawah aplikasi Anda.
  • SCOPE ( String[] ): Daftar lingkup yang diminta.
  • REDIRECT_URI ( String ): URL redirect.

Isi data tanggapan

Data yang dikembalikan ke aplikasi Google diatur dalam aplikasi Anda dengan memanggil setResult() . Data ini mencakup hal-hal berikut:

  • AUTHORIZATION_CODE ( String ): Nilai kode otorisasi.
  • resultCode ( int ): Berkomunikasi keberhasilan atau kegagalan proses dan mengambil salah satu dari nilai berikut:
    • Activity.RESULT_OK : Menunjukkan keberhasilan; kode otorisasi dikembalikan.
    • Activity.RESULT_CANCELLED : Sinyal bahwa pengguna telah membatalkan proses. Dalam hal ini, Google app akan mencoba menautkan akun menggunakan URL otorisasi Anda.
    • -2 : Menunjukkan bahwa kesalahan telah terjadi. Berbagai jenis kesalahan dijelaskan di bawah ini.
  • ERROR_TYPE ( int ): Jenis kesalahan, yang mengambil salah satu dari nilai berikut:
    • 1 : Dipulihkan kesalahan: Google app akan berusaha akun menghubungkan menggunakan URL otorisasi.
    • 2 : Unrecoverable error: akun dibatalkan Aplikasi Google menghubungkan.
    • 3 : valid atau parameter permintaan yang hilang.
  • ERROR_CODE ( int ): Sebuah bilangan bulat yang mewakili sifat dari kesalahan. Untuk melihat apa yang masing-masing berarti kode kesalahan, lihat tabel kode kesalahan .
  • ERROR_DESCRIPTION ( String , opsional): pesan status Manusia dapat dibaca menggambarkan kesalahan.

Nilai untuk AUTHORIZATION_CODE diharapkan ketika resultCode == Activity.RESULT_OK . Dalam semua kasus lain, nilai untuk AUTHORIZATION_CODE perlu kosong. Jika resultCode == -2 , maka ERROR_TYPE nilai diperkirakan akan dihuni.

Tabel kode kesalahan

Tabel di bawah menunjukkan kode kesalahan yang berbeda dan apakah masing-masing merupakan kesalahan yang dapat dipulihkan atau tidak dapat dipulihkan:

Kode kesalahan Berarti 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 kesalahan, Anda harus mengembalikan hasil kesalahan melalui setResult untuk memastikan mundur tepat dipicu.