Halaman ini menjelaskan cara menafsirkan dan menggunakan verdict integritas yang ditampilkan. Baik Anda membuat permintaan API standar maupun klasik, verdict integritas ditampilkan dalam format yang sama dengan konten serupa. Verdict integritas menyampaikan informasi tentang validitas perangkat, aplikasi, dan akun. Server aplikasi Anda dapat menggunakan payload yang dihasilkan dalam verdict yang telah didekripsi dan diverifikasi guna menentukan cara terbaik untuk melanjutkan dengan tindakan atau permintaan tertentu di aplikasi Anda.
Format verdict integritas yang ditampilkan
Payload berupa JSON teks biasa dan berisi sinyal integritas bersama informasi yang disediakan developer.
Berikut adalah struktur payload umum:
{ requestDetails: { ... } appIntegrity: { ... } deviceIntegrity: { ... } accountDetails: { ... } environmentDetails: { ... } }
Anda harus memastikan terlebih dahulu bahwa nilai di kolom requestDetails
cocok dengan nilai
dari permintaan asli sebelum memeriksa setiap verdict integritas. Bagian berikut
menjelaskan setiap kolom secara lebih mendetail.
Kolom detail permintaan
Kolom requestDetails
berisi informasi tentang permintaan, termasuk
informasi yang disediakan developer di requestHash
untuk permintaan standar dan
nonce
untuk permintaan klasik.
Untuk permintaan API standar:
requestDetails: { // Application package name this attestation was requested for. // Note that this field might be spoofed in the middle of the request. requestPackageName: "com.package.name" // Request hash provided by the developer. requestHash: "aGVsbG8gd29scmQgdGhlcmU" // The timestamp in milliseconds when the integrity token // was requested. timestampMillis: "1675655009345" }
Nilai ini harus cocok dengan permintaan asal. Oleh karena itu, verifikasi
bagian requestDetails
payload JSON dengan memastikan bahwa
requestPackageName
dan requestHash
cocok dengan yang dikirim dalam permintaan
asli, seperti yang ditunjukkan dalam cuplikan kode:
Kotlin
val requestDetails = JSONObject(payload).getJSONObject("requestDetails") val requestPackageName = requestDetails.getString("requestPackageName") val requestHash = requestDetails.getString("requestHash") val timestampMillis = requestDetails.getLong("timestampMillis") val currentTimestampMillis = ... // Ensure the token is from your app. if (!requestPackageName.equals(expectedPackageName) // Ensure the token is for this specific request || !requestHash.equals(expectedRequestHash) // Ensure the freshness of the token. || currentTimestampMillis - timestampMillis > ALLOWED_WINDOW_MILLIS) { // The token is invalid! See below for further checks. ... }
Java
RequestDetails requestDetails = decodeIntegrityTokenResponse .getTokenPayloadExternal() .getRequestDetails(); String requestPackageName = requestDetails.getRequestPackageName(); String requestHash = requestDetails.getRequestHash(); long timestampMillis = requestDetails.getTimestampMillis(); long currentTimestampMillis = ...; // Ensure the token is from your app. if (!requestPackageName.equals(expectedPackageName) // Ensure the token is for this specific request. || !requestHash.equals(expectedRequestHash) // Ensure the freshness of the token. || currentTimestampMillis - timestampMillis > ALLOWED_WINDOW_MILLIS) { // The token is invalid! See below for further checks. ... }
Untuk permintaan API klasik:
requestDetails: { // Application package name this attestation was requested for. // Note that this field might be spoofed in the middle of the // request. requestPackageName: "com.package.name" // base64-encoded URL-safe no-wrap nonce provided by the developer. nonce: "aGVsbG8gd29scmQgdGhlcmU" // The timestamp in milliseconds when the request was made // (computed on the server). timestampMillis: "1617893780" }
Nilai ini harus cocok dengan permintaan asal. Oleh karena itu, verifikasi
bagian requestDetails
payload JSON dengan memastikan bahwa
requestPackageName
dan nonce
cocok dengan yang dikirim dalam permintaan asli, seperti
yang ditunjukkan dalam cuplikan kode:
Kotlin
val requestDetails = JSONObject(payload).getJSONObject("requestDetails") val requestPackageName = requestDetails.getString("requestPackageName") val nonce = requestDetails.getString("nonce") val timestampMillis = requestDetails.getLong("timestampMillis") val currentTimestampMillis = ... // Ensure the token is from your app. if (!requestPackageName.equals(expectedPackageName) // Ensure the token is for this specific request. See 'Generate a nonce' // section of the doc on how to store/compute the expected nonce. || !nonce.equals(expectedNonce) // Ensure the freshness of the token. || currentTimestampMillis - timestampMillis > ALLOWED_WINDOW_MILLIS) { // The token is invalid! See below for further checks. ... }
Java
JSONObject requestDetails = new JSONObject(payload).getJSONObject("requestDetails"); String requestPackageName = requestDetails.getString("requestPackageName"); String nonce = requestDetails.getString("nonce"); long timestampMillis = requestDetails.getLong("timestampMillis"); long currentTimestampMillis = ...; // Ensure the token is from your app. if (!requestPackageName.equals(expectedPackageName) // Ensure the token is for this specific request. See 'Generate a nonce' // section of the doc on how to store/compute the expected nonce. || !nonce.equals(expectedNonce) // Ensure the freshness of the token. || currentTimestampMillis - timestampMillis > ALLOWED_WINDOW_MILLIS) { // The token is invalid! See below for further checks. ... }
Kolom integritas aplikasi
Kolom appIntegrity
berisi informasi terkait paket.
appIntegrity: { // PLAY_RECOGNIZED, UNRECOGNIZED_VERSION, or UNEVALUATED. appRecognitionVerdict: "PLAY_RECOGNIZED" // The package name of the app. // This field is populated iff appRecognitionVerdict != UNEVALUATED. packageName: "com.package.name" // The sha256 digest of app certificates (base64-encoded URL-safe). // This field is populated iff appRecognitionVerdict != UNEVALUATED. certificateSha256Digest: ["6a6a1474b5cbbb2b1aa57e0bc3"] // The version of the app. // This field is populated iff appRecognitionVerdict != UNEVALUATED. versionCode: "42" }
appRecognitionVerdict
dapat memiliki nilai berikut:
PLAY_RECOGNIZED
- Aplikasi dan sertifikat cocok dengan versi yang didistribusikan oleh Google Play.
UNRECOGNIZED_VERSION
- Nama paket atau sertifikat tidak cocok dengan data Google Play.
UNEVALUATED
- Integritas aplikasi tidak dievaluasi. Persyaratan yang diperlukan tidak terpenuhi, seperti perangkat tidak cukup tepercaya.
Untuk memastikan bahwa token dibuat oleh aplikasi yang dibuat oleh Anda, pastikan integritas aplikasi seperti yang diharapkan, seperti yang ditampilkan dalam cuplikan kode berikut:
Kotlin
val appIntegrity = JSONObject(payload).getJSONObject("appIntegrity") val appRecognitionVerdict = appIntegrity.getString("appRecognitionVerdict") if (appRecognitionVerdict == "PLAY_RECOGNIZED") { // Looks good! }
Java
JSONObject appIntegrity = new JSONObject(payload).getJSONObject("appIntegrity"); String appRecognitionVerdict = appIntegrity.getString("appRecognitionVerdict"); if (appRecognitionVerdict.equals("PLAY_RECOGNIZED")) { // Looks good! }
Anda juga dapat memeriksa nama paket aplikasi, versi aplikasi, dan sertifikat aplikasi secara manual.
Kolom integritas perangkat
Kolom deviceIntegrity
dapat berisi satu nilai,
deviceRecognitionVerdict
, yang memiliki satu atau beberapa label yang merepresentasikan seberapa baik
perangkat dapat menerapkan integritas aplikasi. Jika perangkat tidak memenuhi kriteria label apa pun,
kolom deviceIntegrity
akan kosong.
deviceIntegrity: { // "MEETS_DEVICE_INTEGRITY" is one of several possible values. deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"] }
Secara default, deviceRecognitionVerdict
dapat berisi hal berikut:
MEETS_DEVICE_INTEGRITY
- Aplikasi berjalan di perangkat yang didukung Android dengan layanan Google Play. Perangkat lulus pemeriksaan integritas sistem dan memenuhi persyaratan kompatibilitas Android.
- Kosong (nilai kosong)
- Aplikasi berjalan pada perangkat yang memiliki tanda-tanda serangan (seperti hooking API) atau penyusupan sistem (seperti di-root), atau aplikasi tidak berjalan pada perangkat fisik (seperti emulator yang tidak lulus pemeriksaan integritas Google Play).
Untuk memastikan bahwa token berasal dari perangkat tepercaya, pastikan
deviceRecognitionVerdict
sesuai dengan yang diharapkan, seperti ditunjukkan dalam cuplikan
kode berikut:
Kotlin
val deviceIntegrity = JSONObject(payload).getJSONObject("deviceIntegrity") val deviceRecognitionVerdict = if (deviceIntegrity.has("deviceRecognitionVerdict")) { deviceIntegrity.getJSONArray("deviceRecognitionVerdict").toString() } else { "" } if (deviceRecognitionVerdict.contains("MEETS_DEVICE_INTEGRITY")) { // Looks good! }
Java
JSONObject deviceIntegrity = new JSONObject(payload).getJSONObject("deviceIntegrity"); String deviceRecognitionVerdict = deviceIntegrity.has("deviceRecognitionVerdict") ? deviceIntegrity.getJSONArray("deviceRecognitionVerdict").toString() : ""; if (deviceRecognitionVerdict.contains("MEETS_DEVICE_INTEGRITY")) { // Looks good! }
Jika Anda mengalami masalah dengan pengujian perangkat memenuhi integritas perangkat, pastikan ROM pabrik sudah diinstal (misalnya, dengan mereset perangkat) dan bootloader terkunci. Anda juga dapat membuat pengujian Play Integrity API di Konsol Play.
Label perangkat bersyarat
Jika aplikasi Anda dirilis ke Google Play Game untuk PC, deviceRecognitionVerdict
juga dapat berisi label berikut:
MEETS_VIRTUAL_INTEGRITY
- Aplikasi berjalan di emulator yang didukung Android dengan layanan Google Play. Emulator lulus pemeriksaan integritas sistem dan memenuhi persyaratan kompatibilitas inti Android.
Informasi perangkat opsional
Jika Anda memilih untuk menerima label
tambahan dalam verdict integritas,
deviceRecognitionVerdict
dapat memiliki label tambahan berikut:
MEETS_BASIC_INTEGRITY
- Aplikasi berjalan di perangkat yang telah lulus pemeriksaan integritas sistem dasar, dan untuk perangkat Android 13 atau yang lebih baru memerlukan Pengesahan Kunci Platform Android. Perangkat mungkin tidak memenuhi persyaratan kompatibilitas Android dan mungkin tidak disetujui untuk menjalankan layanan Google Play. Misalnya, perangkat mungkin menjalankan versi Android yang tidak dikenal, mungkin memiliki bootloader yang tidak terkunci, booting yang tidak diverifikasi, atau mungkin belum disertifikasi oleh produsen.
MEETS_STRONG_INTEGRITY
- Aplikasi tersebut berjalan di perangkat yang didukung Android dengan layanan Google Play dan memiliki jaminan kuat atas integritas sistem seperti bukti integritas booting yang didukung hardware dan untuk perangkat Android 13 atau yang lebih baru harus memiliki update keamanan dalam setahun terakhir. Perangkat lulus pemeriksaan integritas sistem dan memenuhi persyaratan kompatibilitas Android.
Satu perangkat akan menampilkan beberapa label perangkat dalam verdict integritas perangkat jika setiap kriteria label terpenuhi.
Aktivitas perangkat terbaru
Anda juga dapat ikut serta dalam aktivitas perangkat terbaru, yang memberi tahu berapa kali aplikasi Anda meminta token integritas di perangkat tertentu dalam satu jam terakhir. Anda dapat menggunakan aktivitas perangkat terbaru untuk melindungi aplikasi dari perangkat hiperaktif yang tidak terduga yang mungkin merupakan indikasi serangan aktif. Anda dapat menentukan seberapa besar tingkat kepercayaan terhadap setiap level aktivitas perangkat terbaru berdasarkan perkiraan jumlah aplikasi Anda diinstal di perangkat standar untuk meminta token integritas setiap jamnya.
Jika Anda memilih untuk menerima recentDeviceActivity
, kolom deviceIntegrity
akan memiliki dua nilai:
deviceIntegrity: { deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"] recentDeviceActivity: { // "LEVEL_2" is one of several possible values. deviceActivityLevel: "LEVEL_2" } }
Definisi deviceActivityLevel
berbeda-beda di antara mode dan dapat memiliki
salah satu nilai berikut:
Level aktivitas perangkat terbaru | Permintaan token integritas API standar di perangkat ini dalam satu jam terakhir per aplikasi | Permintaan token integritas API klasik di perangkat ini dalam satu jam terakhir per aplikasi |
---|---|---|
LEVEL_1 (terendah) |
10 atau lebih sedikit | 5 atau kurang |
LEVEL_2 |
Antara 11 dan 25 | Antara 6 dan 10 |
LEVEL_3 |
Antara 26 dan 50 | Antara 11 dan 15 |
LEVEL_4 (tertinggi) |
Lebih dari 50 | Lebih dari 15 |
UNEVALUATED |
Aktivitas perangkat terbaru tidak dievaluasi. Hal ini dapat terjadi
karena:
|
Atribut perangkat
Anda juga dapat memilih untuk menggunakan atribut perangkat, yang memberi tahu versi Android SDK Android OS yang berjalan di perangkat. Di masa mendatang, atribut ini dapat diperluas dengan atribut perangkat lainnya.
Nilai versi SDK adalah nomor versi Android SDK yang ditentukan di
Build.VERSION_CODES
. Versi SDK
tidak dievaluasi jika persyaratan yang diperlukan tidak terpenuhi. Dalam hal ini,
kolom sdkVersion
tidak ditetapkan; sehingga, kolom deviceAttributes
kosong.
Hal ini dapat terjadi karena:
- Perangkat tidak cukup tepercaya.
- Versi aplikasi yang diinstal di perangkat tidak dikenal oleh Google Play.
- Terjadi masalah teknis pada perangkat.
Jika Anda memilih untuk menerima deviceAttributes
, kolom deviceIntegrity
akan memiliki kolom tambahan berikut:
deviceIntegrity: { deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"] deviceAttributes: { // 33 is one possible value, which represents Android 13 (Tiramisu). sdkVersion: 33 } }
Jika versi SDK tidak dievaluasi, kolom deviceAttributes
akan
ditetapkan sebagai berikut:
deviceIntegrity: { deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"] deviceAttributes: {} // sdkVersion field is not set. }
Kolom detail akun
Kolom accountDetails
berisi satu nilai, appLicensingVerdict
, yang
menunjukkan status pemberian lisensi Google Play aplikasi untuk akun pengguna yang
login di perangkat. Jika akun pengguna memiliki lisensi Play untuk aplikasi,
artinya mereka telah mendownload atau membelinya dari Google Play.
accountDetails: { // This field can be LICENSED, UNLICENSED, or UNEVALUATED. appLicensingVerdict: "LICENSED" }
appLicensingVerdict
dapat memiliki salah satu nilai berikut:
LICENSED
- Pengguna memiliki hak aplikasi. Dengan kata lain, pengguna menginstal atau mengupdate aplikasi Anda dari Google Play di perangkatnya.
UNLICENSED
- Pengguna tidak memiliki hak aplikasi. Hal ini terjadi saat, misalnya, pengguna melakukan sideload pada aplikasi Anda atau tidak menginstalnya dari Google Play. Anda dapat menampilkan dialog GET_LicenseD kepada pengguna untuk memperbaiki masalah ini.
UNEVALUATED
Detail pemberian lisensi tidak dievaluasi karena persyaratan yang diperlukan tidak terpenuhi.
Hal ini dapat terjadi karena beberapa alasan, termasuk:
- Perangkat tidak cukup tepercaya.
- Versi aplikasi yang diinstal di perangkat tidak dikenal oleh Google Play.
- Pengguna tidak login ke Google Play.
Untuk memeriksa apakah pengguna memiliki hak aplikasi untuk aplikasi Anda, verifikasi bahwa
appLicensingVerdict
sudah sesuai harapan, seperti yang ditunjukkan dalam cuplikan kode berikut:
Kotlin
val accountDetails = JSONObject(payload).getJSONObject("accountDetails") val appLicensingVerdict = accountDetails.getString("appLicensingVerdict") if (appLicensingVerdict == "LICENSED") { // Looks good! }
Java
JSONObject accountDetails = new JSONObject(payload).getJSONObject("accountDetails"); String appLicensingVerdict = accountDetails.getString("appLicensingVerdict"); if (appLicensingVerdict.equals("LICENSED")) { // Looks good! }
Kolom detail lingkungan
Anda juga dapat memilih untuk menerima sinyal tambahan tentang lingkungan. Risiko akses aplikasi memberi tahu aplikasi Anda apakah ada aplikasi lain yang berjalan dan dapat digunakan untuk mengambil screenshot, menampilkan overlay, atau mengontrol perangkat. Verdict Play Protect memberi tahu Anda apakah Google Play Protect diaktifkan di perangkat dan apakah Google Play Protect telah menemukan malware yang diketahui.
Jika Anda telah memilih ikut serta dalam verdict Risiko Akses Aplikasi atau verdict Play Protect
di Konsol Google Play, respons API Anda akan menyertakan
kolom environmentDetails
. Kolom environmentDetails
dapat berisi dua
nilai, appAccessRiskVerdict
dan playProtectVerdict
.
Verdict risiko akses aplikasi
Setelah diaktifkan, kolom environmentDetails
di payload Play Integrity API
akan berisi
verdict risiko akses aplikasi baru.
{
requestDetails: { ... }
appIntegrity: { ... }
deviceIntegrity: { ... }
accountDetails: { ... }
environmentDetails: {
appAccessRiskVerdict: {
// This field contains one or more responses, for example the following.
appsDetected: ["KNOWN_INSTALLED", "UNKNOWN_INSTALLED", "UNKNOWN_CAPTURING"]
}
}
}
Jika risiko akses aplikasi dievaluasi, appAccessRiskVerdict
akan berisi kolom
appsDetected
dengan satu atau beberapa respons. Respons ini termasuk dalam salah satu
dari dua grup berikut, bergantung pada sumber penginstalan aplikasi yang terdeteksi:
Aplikasi sistem atau Play: Aplikasi yang diinstal oleh Google Play atau yang dimuat sebelumnya oleh produsen perangkat di partisi sistem perangkat (diidentifikasi dengan
FLAG_SYSTEM
). Respons untuk aplikasi tersebut diawali denganKNOWN_
.Aplikasi lainnya: Aplikasi yang tidak diinstal oleh Google Play. Aplikasi lainnya tidak mencakup aplikasi yang dimuat sebelumnya di partisi sistem oleh produsen perangkat. Respons untuk aplikasi tersebut diawali dengan
UNKNOWN_
.
Respons berikut dapat ditampilkan:
KNOWN_INSTALLED
,UNKNOWN_INSTALLED
- Ada aplikasi terinstal yang cocok dengan sumber penginstalan yang sesuai.
KNOWN_CAPTURING
,UNKNOWN_CAPTURING
- Ada aplikasi yang berjalan dengan izin diaktifkan yang dapat digunakan untuk melihat layar saat aplikasi Anda sedang berjalan. Aplikasi tersebut tidak mencakup layanan aksesibilitas terverifikasi yang diketahui oleh Google Play yang berjalan di perangkat.
KNOWN_CONTROLLING
,UNKNOWN_CONTROLLING
- Ada aplikasi yang berjalan dengan izin diaktifkan yang dapat digunakan untuk mengontrol perangkat dan mengontrol input ke aplikasi Anda secara langsung, serta dapat digunakan untuk merekam input dan output aplikasi Anda. Aplikasi tersebut tidak mencakup layanan aksesibilitas terverifikasi yang dikenal oleh Google Play yang berjalan di perangkat.
KNOWN_OVERLAYS
,UNKNOWN_OVERLAYS
- Ada aplikasi yang berjalan dengan izin diaktifkan yang dapat digunakan untuk menampilkan overlay di aplikasi Anda. Aplikasi tersebut tidak mencakup layanan aksesibilitas terverifikasi yang diketahui oleh Google Play yang berjalan di perangkat.
- Kosong (nilai kosong)
Risiko akses aplikasi tidak dievaluasi jika persyaratan yang diperlukan tidak terpenuhi. Dalam hal ini, kolom
appAccessRiskVerdict
kosong. Hal ini dapat terjadi karena beberapa alasan, termasuk:- Perangkat tidak cukup tepercaya.
- Faktor bentuk perangkat bukan ponsel, tablet, atau perangkat foldable.
- Perangkat tidak menjalankan Android 6 (API level 23) atau yang lebih baru.
- Versi aplikasi yang diinstal di perangkat tidak dikenal oleh Google Play.
- Versi Google Play Store di perangkat sudah lama.
- Khusus game: Akun pengguna tidak memiliki lisensi Play untuk game.
- Permintaan standar digunakan dengan parameter
verdictOptOut
. - Permintaan standar digunakan dengan versi library Play Integrity API yang belum mendukung risiko akses aplikasi untuk permintaan standar.
Risiko akses aplikasi akan secara otomatis mengecualikan layanan aksesibilitas terverifikasi yang
telah melalui peninjauan aksesibilitas Google Play yang ditingkatkan (diinstal oleh
app store apa pun di perangkat). "Dikecualikan" berarti bahwa layanan aksesibilitas terverifikasi
yang berjalan di perangkat tidak akan menampilkan respons perekaman, pengontrolan, atau
overlay dalam verdict risiko akses aplikasi. Untuk meminta peninjauan aksesibilitas Google
Play yang ditingkatkan untuk aplikasi aksesibilitas Anda, publikasikan di Google
Play dengan memastikan bahwa aplikasi Anda memiliki tanda isAccessibilityTool
yang disetel ke benar di
manifes aplikasi, atau minta peninjauan.
Tabel berikut memberikan beberapa contoh verdict dan artinya (tabel ini tidak mencantumkan setiap kemungkinan hasil):
Contoh respons verdict risiko akses aplikasi | Interpretasi |
---|---|
appsDetected: ["KNOWN_INSTALLED"]
|
Hanya terdapat aplikasi terinstal yang dikenali oleh Google Play atau yang dimuat sebelumnya di partisi sistem oleh produsen perangkat. Tidak ada aplikasi yang berjalan yang akan menghasilkan verdict pengambilan, kontrol, atau overlay. |
appsDetected: ["KNOWN_INSTALLED", "UNKNOWN_INSTALLED", "UNKNOWN_CAPTURING"]
|
Ada aplikasi yang diinstal oleh Google Play atau yang dimuat sebelumnya di partisi sistem oleh produsen perangkat. Ada aplikasi lain yang berjalan dengan izin diaktifkan yang dapat digunakan untuk melihat layar atau merekam input dan output lainnya. |
appsDetected: ["KNOWN_INSTALLED", "KNOWN_CAPTURING", "UNKNOWN_INSTALLED", "UNKNOWN_CONTROLLING"]
|
Ada aplikasi Play atau sistem yang berjalan dengan izin diaktifkan yang dapat digunakan untuk melihat layar atau merekam input dan output lainnya. Ada juga aplikasi lainnya yang berjalan dengan izin diaktifkan yang dapat digunakan untuk mengontrol perangkat dan mengontrol input ke aplikasi Anda secara langsung. |
appAccessRiskVerdict: {}
|
Risiko akses aplikasi tidak dievaluasi karena persyaratan yang diperlukan tidak terpenuhi. Misalnya, perangkat tidak cukup tepercaya. |
Bergantung pada tingkat risiko, Anda dapat menentukan kombinasi verdict apa yang dapat diterima untuk dilanjutkan dan verdict mana yang ingin ditindaklanjuti. Cuplikan kode berikut mengilustrasikan contoh verifikasi bahwa tidak ada aplikasi yang berjalan yang dapat merekam layar atau mengontrol aplikasi Anda:
Kotlin
val environmentDetails = JSONObject(payload).getJSONObject("environmentDetails") val appAccessRiskVerdict = environmentDetails.getJSONObject("appAccessRiskVerdict") if (appAccessRiskVerdict.has("appsDetected")) { val appsDetected = appAccessRiskVerdict.getJSONArray("appsDetected").toString() if (!appsDetected.contains("CAPTURING") && !appsDetected.contains("CONTROLLING")) { // Looks good! } }
Java
JSONObject environmentDetails = new JSONObject(payload).getJSONObject("environmentDetails"); JSONObject appAccessRiskVerdict = environmentDetails.getJSONObject("appAccessRiskVerdict"); if (appAccessRiskVerdict.has("appsDetected")) { String appsDetected = appAccessRiskVerdict.getJSONArray("appsDetected").toString() if (!appsDetected.contains("CAPTURING") && !appsDetected.contains("CONTROLLING")) { // Looks good! } }
Memperbaiki verdict risiko akses aplikasi
Bergantung pada tingkat risiko, Anda dapat menentukan verdict risiko akses aplikasi yang ingin ditindaklanjuti sebelum mengizinkan pengguna menyelesaikan permintaan atau tindakan. Ada perintah Google Play opsional yang dapat Anda tampilkan kepada pengguna setelah memeriksa verdict risiko akses aplikasi. Anda dapat menampilkan CLOSE_UNKNOWN_ACCESS_RISK untuk meminta pengguna menutup aplikasi tidak dikenal yang menyebabkan verdict risiko akses aplikasi atau Anda dapat menampilkan CLOSE_ALL_ACCESS_RISK untuk meminta pengguna menutup semua aplikasi (dikenal dan tidak dikenal) yang menyebabkan verdict risiko akses aplikasi.
Verdict Play Protect
Setelah diaktifkan, kolom environmentDetails
di payload Play Integrity API
akan berisi
verdict Play Protect:
environmentDetails: {
playProtectVerdict: "NO_ISSUES"
}
playProtectVerdict
dapat memiliki salah satu nilai berikut:
NO_ISSUES
- Play Protect diaktifkan dan tidak menemukan masalah aplikasi apa pun di perangkat.
NO_DATA
- Play Protect diaktifkan, tetapi belum ada pemindaian yang dilakukan. Perangkat atau aplikasi Play Store mungkin baru saja direset.
POSSIBLE_RISK
- Play Protect dinonaktifkan.
MEDIUM_RISK
- Play Protect diaktifkan dan telah menemukan aplikasi yang berpotensi membahayakan diinstal di perangkat.
HIGH_RISK
- Play Protect diaktifkan dan telah menemukan aplikasi berbahaya diinstal di perangkat.
UNEVALUATED
Verdict Play Protect tidak dievaluasi.
Hal ini dapat terjadi karena beberapa alasan, termasuk:
- Perangkat tidak cukup tepercaya.
- Khusus game: Akun pengguna tidak memiliki lisensi Play untuk game.
Panduan penggunaan verdict Play Protect
Server backend aplikasi Anda dapat menentukan cara bertindak berdasarkan verdict berdasarkan toleransi risiko Anda. Berikut adalah beberapa saran dan tindakan yang dapat dilakukan pengguna:
NO_ISSUES
- Play Protect diaktifkan dan belum menemukan masalah apa pun sehingga tidak ada tindakan yang perlu dilakukan pengguna.
POSSIBLE_RISK
danNO_DATA
- Jika menerima verdict ini, minta pengguna untuk memeriksa apakah Play Protect sudah diaktifkan
dan telah melakukan pemindaian.
NO_DATA
hanya akan muncul dalam situasi yang jarang terjadi. MEDIUM_RISK
danHIGH_RISK
- Bergantung pada toleransi risiko, Anda dapat meminta pengguna untuk meluncurkan Play Protect dan mengambil tindakan terhadap peringatan Play Protect. Jika pengguna tidak dapat memenuhi persyaratan ini, Anda dapat memblokirnya dari tindakan server.