Verdict integritas

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. 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, 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. 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:
  • Perangkat tidak cukup tepercaya.
  • Versi aplikasi yang diinstal di perangkat tidak dikenal oleh Google Play.
  • Masalah teknis pada perangkat.

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 jika 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 dengan KNOWN_.

  • 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 menggunakan 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 dan NO_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 dan HIGH_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.