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:
- Aplikasi Google memeriksa apakah aplikasi Anda telah diinstal di perangkat menggunakan nama paket.
- Aplikasi Google menggunakan pemeriksaan tanda tangan paket untuk memvalidasi bahwa aplikasi adalah aplikasi yang benar.
- 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.
- Aplikasi Anda memvalidasi bahwa permintaan berasal dari aplikasi Google. Untuk melakukannya, aplikasi Anda akan memeriksa tanda tangan paket dan ID klien yang diberikan.
- Aplikasi Anda meminta kode otorisasi dari server OAuth 2.0. Di akhir alur ini, ia mengembalikan kode otorisasi atau kesalahan ke Aplikasi Google.
- 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:
Tambahkan
<intent-filter>
ke fileAndroidManifest.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>
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 }
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... } }
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()
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
): Googleclient_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.