این صفحه نحوه تفسیر و کار با حکم یکپارچگی برگشتی را شرح می دهد. چه درخواست API استاندارد یا کلاسیک داشته باشید، حکم یکپارچگی در همان قالب با محتوای مشابه برگردانده میشود. حکم یکپارچگی اطلاعات مربوط به اعتبار دستگاهها، برنامهها و حسابها را به اشتراک میگذارد. سرور برنامه شما میتواند از محموله بهدستآمده در یک حکم رمزگشایی و تأیید شده برای تعیین بهترین روش انجام یک اقدام یا درخواست خاص در برنامه شما استفاده کند.
قالب حکم یکپارچگی برگردانده شده
محموله JSON متن ساده است و حاوی سیگنال های یکپارچگی در کنار اطلاعات ارائه شده توسط توسعه دهنده است.
ساختار کلی بار به شرح زیر است:
{ requestDetails: { ... } appIntegrity: { ... } deviceIntegrity: { ... } accountDetails: { ... } environmentDetails: { ... } }
قبل از بررسی هر حکم یکپارچگی، ابتدا باید بررسی کنید که مقادیر موجود در قسمت requestDetails
با مقادیر درخواست اصلی مطابقت داشته باشد. بخش های بعدی هر فیلد را با جزئیات بیشتری توضیح می دهند.
فیلد جزئیات درخواست
فیلد requestDetails
حاوی اطلاعاتی درباره درخواست است، از جمله اطلاعات ارائه شده توسط توسعهدهنده در requestHash
برای درخواستهای استاندارد و nonce
برای درخواستهای کلاسیک.
برای درخواست های استاندارد API:
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" }
این مقادیر باید با مقادیر درخواست اصلی مطابقت داشته باشد. بنابراین، همانطور که در قطعه کد زیر نشان داده شده است، با اطمینان از مطابقت requestPackageName
و requestHash
با آنچه در درخواست اصلی ارسال شده است، قسمت requestDetails
از بار JSON را تأیید کنید:
کاتلین
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. ... }
جاوا
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. ... }
برای درخواست های API کلاسیک :
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" }
این مقادیر باید با مقادیر درخواست اصلی مطابقت داشته باشد. بنابراین، همانطور که در قطعه کد زیر نشان داده شده است، با اطمینان از مطابقت requestPackageName
و nonce
با آنچه در درخواست اصلی ارسال شده است، قسمت requestDetails
از payload JSON را تأیید کنید:
کاتلین
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. ... }
جاوا
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. ... }
زمینه یکپارچگی برنامه
قسمت appIntegrity
حاوی اطلاعات مربوط به بسته است.
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
می تواند مقادیر زیر را داشته باشد:
-
PLAY_RECOGNIZED
- برنامه و گواهی با نسخه های توزیع شده توسط Google Play مطابقت دارند.
-
UNRECOGNIZED_VERSION
- گواهی یا نام بسته با سوابق Google Play مطابقت ندارد.
-
UNEVALUATED
- یکپارچگی برنامه ارزیابی نشد. یک نیاز ضروری از قلم افتاده بود، مانند دستگاه به اندازه کافی قابل اعتماد نبود.
برای اطمینان از اینکه توکن توسط برنامه ای که توسط شما ایجاد شده است، بررسی کنید که یکپارچگی برنامه مطابق انتظار است، همانطور که در قطعه کد زیر نشان داده شده است:
کاتلین
val appIntegrity = JSONObject(payload).getJSONObject("appIntegrity") val appRecognitionVerdict = appIntegrity.getString("appRecognitionVerdict") if (appRecognitionVerdict == "PLAY_RECOGNIZED") { // Looks good! }
جاوا
JSONObject appIntegrity = new JSONObject(payload).getJSONObject("appIntegrity"); String appRecognitionVerdict = appIntegrity.getString("appRecognitionVerdict"); if (appRecognitionVerdict.equals("PLAY_RECOGNIZED")) { // Looks good! }
همچنین میتوانید نام بسته برنامه، نسخه برنامه و گواهیهای برنامه را به صورت دستی بررسی کنید.
زمینه یکپارچگی دستگاه
فیلد deviceIntegrity
میتواند حاوی یک مقدار واحد باشد، deviceRecognitionVerdict
، که دارای یک یا چند برچسب است که نشان میدهد دستگاه چقدر میتواند یکپارچگی برنامه را اعمال کند. اگر دستگاهی با معیارهای هیچ یک از برچسب ها مطابقت نداشته باشد، قسمت deviceIntegrity
خالی است.
deviceIntegrity: { // "MEETS_DEVICE_INTEGRITY" is one of several possible values. deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"] }
به طور پیش فرض، deviceRecognitionVerdict
می تواند شامل موارد زیر باشد:
-
MEETS_DEVICE_INTEGRITY
- این برنامه روی یک دستگاه مجهز به اندروید با سرویسهای Google Play اجرا میشود. دستگاه بررسی های یکپارچگی سیستم را انجام می دهد و شرایط سازگاری Android را برآورده می کند.
- خالی (یک مقدار خالی)
- برنامه روی دستگاهی اجرا میشود که نشانههای حمله (مانند اتصال API) یا به خطر افتادن سیستم (مانند روت شدن) دارد، یا برنامه روی یک دستگاه فیزیکی اجرا نمیشود (مانند شبیهسازیهایی که از یکپارچگی Google Play عبور نمیکنند). چک ها).
برای اطمینان از اینکه نشانه از یک دستگاه قابل اعتماد آمده است، همانطور که در قطعه کد زیر نشان داده شده است، تأیید کنید که deviceRecognitionVerdict
مطابق انتظار است:
کاتلین
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! }
جاوا
JSONObject deviceIntegrity = new JSONObject(payload).getJSONObject("deviceIntegrity"); String deviceRecognitionVerdict = deviceIntegrity.has("deviceRecognitionVerdict") ? deviceIntegrity.getJSONArray("deviceRecognitionVerdict").toString() : ""; if (deviceRecognitionVerdict.contains("MEETS_DEVICE_INTEGRITY")) { // Looks good! }
اگر مشکلی با یکپارچگی دستگاه ملاقات دستگاه آزمایشی خود دارید، مطمئن شوید که رام کارخانه نصب شده باشد (مثلاً با ریست کردن دستگاه) و بوت لودر قفل شده باشد. همچنین میتوانید تستهای Play Integrity API را در Play Console خود ایجاد کنید .
برچسب های دستگاه مشروط
اگر برنامه شما در بازیهای Google Play برای رایانه شخصی منتشر میشود، deviceRecognitionVerdict
همچنین میتواند دارای برچسب زیر باشد:
-
MEETS_VIRTUAL_INTEGRITY
- این برنامه بر روی یک شبیه ساز مبتنی بر اندروید با خدمات Google Play اجرا می شود. شبیه ساز بررسی های یکپارچگی سیستم را انجام می دهد و الزامات اصلی سازگاری اندروید را برآورده می کند.
اطلاعات دستگاه اختیاری
اگر برای دریافت برچسبهای اضافی در حکم یکپارچگی شرکت کنید ، deviceRecognitionVerdict
میتواند حاوی برچسبهای اضافی زیر باشد:
-
MEETS_BASIC_INTEGRITY
- این برنامه روی دستگاهی اجرا میشود که بررسیهای اولیه یکپارچگی سیستم را انجام میدهد و برای دستگاههای Android 13 یا جدیدتر به تأیید کلید پلتفرم Android نیاز دارد. ممکن است دستگاه الزامات سازگاری Android را نداشته باشد و ممکن است برای اجرای خدمات Google Play تأیید نشده باشد. به عنوان مثال، ممکن است دستگاه دارای یک نسخه ناشناخته اندروید باشد، ممکن است بوت لودر آنلاک شده باشد، بوت تایید نشده باشد یا ممکن است توسط سازنده تایید نشده باشد.
-
MEETS_STRONG_INTEGRITY
- این برنامه بر روی یک دستگاه مجهز به اندروید با سرویسهای Google Play اجرا میشود و دارای ضمانت قوی برای یکپارچگی سیستم مانند اثبات یکپارچگی بوت با پشتوانه سختافزاری است و برای دستگاههای Android 13 یا بالاتر نیاز به بهروزرسانی امنیتی در سال گذشته دارد. دستگاه بررسی های یکپارچگی سیستم را انجام می دهد و شرایط سازگاری Android را برآورده می کند.
اگر هر یک از معیارهای برچسب رعایت شود، یک دستگاه، چندین برچسب دستگاه را در حکم یکپارچگی دستگاه برمی گرداند.
فعالیت اخیر دستگاه
همچنین میتوانید فعالیتهای اخیر دستگاه را انتخاب کنید، که به شما میگوید چند بار برنامهتان در یک ساعت گذشته، یک کد یکپارچگی را در یک دستگاه خاص درخواست کرده است. میتوانید از فعالیتهای اخیر دستگاه برای محافظت از برنامهتان در برابر دستگاههای غیرمنتظره و بیش فعالی که میتواند نشانهای از یک حمله فعال باشد، استفاده کنید. بر اساس اینکه انتظار دارید هر ساعت چند بار برنامه نصب شده روی یک دستگاه معمولی درخواست یک توکن یکپارچگی کند، میتوانید تصمیم بگیرید که چقدر به هر سطح فعالیت اخیر دستگاه اعتماد کنید.
اگر دریافت recentDeviceActivity
را انتخاب کنید، فیلد deviceIntegrity
دو مقدار خواهد داشت:
deviceIntegrity: { deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"] recentDeviceActivity: { // "LEVEL_2" is one of several possible values. deviceActivityLevel: "LEVEL_2" } }
تعاریف deviceActivityLevel
بین حالت ها متفاوت است و می تواند یکی از مقادیر زیر را داشته باشد:
سطح فعالیت اخیر دستگاه | درخواست کد یکپارچگی استاندارد API در این دستگاه در آخرین ساعت در هر برنامه | درخواستهای رمز یکپارچگی API کلاسیک در این دستگاه در آخرین ساعت برای هر برنامه |
---|---|---|
LEVEL_1 (پایین ترین) | 10 یا کمتر | 5 یا کمتر |
LEVEL_2 | بین 11 تا 25 | بین 6 تا 10 |
LEVEL_3 | بین 26 تا 50 | بین 11 تا 15 |
LEVEL_4 (بالاترین) | بیش از 50 | بیش از 15 |
UNEVALUATED | فعالیت اخیر دستگاه ارزیابی نشد. این ممکن است اتفاق بیفتد زیرا:
|
ویژگی های دستگاه
همچنین میتوانید ویژگیهای دستگاه را انتخاب کنید، که به نسخه Android SDK سیستم عامل Android در حال اجرا روی دستگاه میگوید. در آینده، ممکن است با سایر ویژگی های دستگاه گسترش یابد.
مقدار نسخه SDK، شماره نسخه Android SDK است که در Build.VERSION_CODES
تعریف شده است. نسخه SDK ارزیابی نمی شود اگر یک نیاز ضروری نادیده گرفته شود. در این مورد، فیلد sdkVersion
تنظیم نشده است. بنابراین، قسمت deviceAttributes
خالی است. این ممکن است اتفاق بیفتد زیرا:
- دستگاه به اندازه کافی قابل اعتماد نیست.
- نسخه برنامه نصب شده شما در دستگاه برای Google Play ناشناخته است.
- مشکلات فنی روی دستگاه وجود داشت.
اگر برای دریافت deviceAttributes
شرکت کنید، فیلد deviceIntegrity
دارای فیلد اضافی زیر خواهد بود:
deviceIntegrity: { deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"] deviceAttributes: { // 33 is one possible value, which represents Android 13 (Tiramisu). sdkVersion: 33 } }
در صورتی که نسخه SDK ارزیابی نشود، قسمت deviceAttributes
به صورت زیر تنظیم می شود:
deviceIntegrity: { deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"] deviceAttributes: {} // sdkVersion field is not set. }
فیلد جزئیات حساب
قسمت accountDetails
حاوی یک مقدار است، appLicensingVerdict
، که وضعیت مجوز Google Play برنامه را برای حساب کاربری که در دستگاه وارد شده است نشان میدهد. اگر حساب کاربری دارای مجوز Play برای برنامه باشد، به این معنی است که آن را دانلود کرده یا از Google Play خریداری کرده است.
accountDetails: { // This field can be LICENSED, UNLICENSED, or UNEVALUATED. appLicensingVerdict: "LICENSED" }
appLicensingVerdict
می تواند یکی از مقادیر زیر را داشته باشد:
-
LICENSED
- کاربر دارای حق برنامه است. به عبارت دیگر، کاربر برنامه شما را از Google Play روی دستگاه خود نصب یا به روز کرد.
-
UNLICENSED
- کاربر حق برنامه ندارد. این زمانی اتفاق میافتد که، برای مثال، کاربر برنامه شما را به صورت جانبی بارگذاری میکند یا آن را از Google Play خریداری نمیکند. برای رفع این مشکل میتوانید گفتگوی GET_LICENSED را به کاربران نشان دهید.
-
UNEVALUATED
جزئیات مجوز مورد ارزیابی قرار نگرفت زیرا یک نیاز ضروری نادیده گرفته شد.
این ممکن است به دلایل مختلفی رخ دهد، از جمله موارد زیر:
- دستگاه به اندازه کافی قابل اعتماد نیست.
- نسخه برنامه نصب شده شما در دستگاه برای Google Play ناشناخته است.
- کاربر وارد Google Play نشده است.
برای بررسی اینکه کاربر دارای حق برنامه برای برنامه شما است، بررسی کنید که appLicensingVerdict
مطابق انتظار است، همانطور که در قطعه کد زیر نشان داده شده است:
کاتلین
val accountDetails = JSONObject(payload).getJSONObject("accountDetails") val appLicensingVerdict = accountDetails.getString("appLicensingVerdict") if (appLicensingVerdict == "LICENSED") { // Looks good! }
جاوا
JSONObject accountDetails = new JSONObject(payload).getJSONObject("accountDetails"); String appLicensingVerdict = accountDetails.getString("appLicensingVerdict"); if (appLicensingVerdict.equals("LICENSED")) { // Looks good! }
فیلد جزئیات محیطی
همچنین می توانید سیگنال های اضافی در مورد محیط را انتخاب کنید. خطر دسترسی به برنامه به برنامه شما میگوید که آیا برنامههای دیگری در حال اجرا هستند که میتوان از آنها برای تصویربرداری از صفحه، نمایش پوششها یا کنترل دستگاه استفاده کرد. حکم Play Protect به شما می گوید که آیا Google Play Protect در دستگاه فعال است و آیا بدافزار شناخته شده را پیدا کرده است یا خیر.
اگر حکم خطر دسترسی به برنامه یا حکم Play Protect را در کنسول Google Play خود انتخاب کردهاید، پاسخ API شما شامل قسمت environmentDetails
میشود. فیلد environmentDetails
می تواند شامل دو مقدار appAccessRiskVerdict
و playProtectVerdict
باشد.
حکم خطر دسترسی به برنامه
پس از فعال شدن، فیلد environmentDetails
در محموله Play Integrity API حاوی حکم جدید خطر دسترسی برنامه خواهد بود.
{
requestDetails: { ... }
appIntegrity: { ... }
deviceIntegrity: { ... }
accountDetails: { ... }
environmentDetails: {
appAccessRiskVerdict: {
// This field contains one or more responses, for example the following.
appsDetected: ["KNOWN_INSTALLED", "UNKNOWN_INSTALLED", "UNKNOWN_CAPTURING"]
}
}
}
اگر خطر دسترسی به برنامه ارزیابی شد، appAccessRiskVerdict
حاوی appsDetected
فیلدی است که با یک یا چند پاسخ شناسایی شده اند. این پاسخ ها بسته به منبع نصب برنامه های شناسایی شده در یکی از دو گروه زیر قرار می گیرند:
برنامه های Play یا سیستم : برنامه هایی که توسط Google Play نصب شده یا توسط سازنده دستگاه از قبل در پارتیشن سیستم دستگاه بارگذاری شده اند (با
FLAG_SYSTEM
مشخص شده است). پاسخهای چنین برنامههایی با پیشوندKNOWN_
هستند.سایر برنامهها : برنامههایی که توسط Google Play نصب نشدهاند. این شامل برنامههایی نمیشود که توسط سازنده دستگاه از قبل روی پارتیشن سیستم بارگذاری شدهاند. پاسخ برای چنین برنامه هایی با پیشوند
UNKNOWN_
است.
پاسخ های زیر را می توان برگرداند:
-
KNOWN_INSTALLED
،UNKNOWN_INSTALLED
- برنامههایی نصب شدهاند که با منبع نصب مربوطه مطابقت دارند.
-
KNOWN_CAPTURING
،UNKNOWN_CAPTURING
- برنامههایی در حال اجرا هستند که مجوزهایی فعال دارند و میتوان از آنها برای مشاهده صفحه هنگام اجرای برنامه استفاده کرد. این شامل هر سرویس دسترسی تأیید شده شناخته شده برای Google Play که در دستگاه اجرا می شود، نمی شود.
-
KNOWN_CONTROLLING
،UNKNOWN_CONTROLLING
- برنامههایی در حال اجرا هستند که دارای مجوزهایی هستند که میتوانند برای کنترل دستگاه و کنترل مستقیم ورودیهای برنامه شما استفاده شوند و میتوانند برای گرفتن ورودیها و خروجیهای برنامه شما استفاده شوند. این شامل هر سرویس دسترسی تأیید شده شناخته شده برای Google Play که در دستگاه اجرا می شود، نمی شود.
-
KNOWN_OVERLAYS
،UNKNOWN_OVERLAYS
- برنامههایی در حال اجرا هستند که دارای مجوزهایی هستند که میتوانند برای نمایش همپوشانیها در برنامه شما استفاده شوند. این شامل هر سرویس دسترسی تأیید شده شناخته شده برای Google Play که در دستگاه اجرا می شود، نمی شود.
- خالی (یک مقدار خالی)
در صورتی که یک نیاز ضروری از قلم افتاده باشد، خطر دسترسی به برنامه ارزیابی نمی شود. در این حالت فیلد
appAccessRiskVerdict
خالی است. این ممکن است به دلایل مختلفی رخ دهد، از جمله موارد زیر:- دستگاه به اندازه کافی قابل اعتماد نیست.
- فاکتور فرم دستگاه تلفن، تبلت یا تاشو نیست.
- دستگاه دارای Android 6 (سطح API 23) یا بالاتر نیست.
- نسخه برنامه نصب شده شما در دستگاه برای Google Play ناشناخته است.
- نسخه فروشگاه Google Play در دستگاه قدیمی است.
- فقط بازی ها : حساب کاربری مجوز Play برای بازی ندارد.
- یک درخواست استاندارد با پارامتر
verdictOptOut
استفاده شد. - یک درخواست استاندارد با نسخه کتابخانه Play Integrity API استفاده شد که هنوز از خطر دسترسی برنامه برای درخواستهای استاندارد پشتیبانی نمیکند.
خطر دسترسی به برنامه بهطور خودکار سرویسهای دسترسپذیری تأییدشده را که از طریق بررسی دسترسپذیری پیشرفته Google Play (نصب شده توسط هر فروشگاه برنامه روی دستگاه) انجام شده است، حذف میکند. «مستثنی» به این معنی است که سرویسهای دسترسپذیری تأییدشده که روی دستگاه اجرا میشوند، پاسخ عکسبرداری، کنترل یا همپوشانی را در حکم خطر دسترسی به برنامه نشان نمیدهند. برای درخواست بررسی دسترسپذیری پیشرفته Google Play برای برنامه دسترسپذیری خود، آن را در Google Play منتشر کنید تا مطمئن شوید که برنامه شما پرچم isAccessibilityTool
را در مانیفست برنامهتان روی true تنظیم کرده باشد، یا درخواست بررسی کنید .
جدول زیر چند نمونه از احکام و معنای آنها را نشان می دهد (این جدول همه نتایج ممکن را فهرست نمی کند):
نمونه پاسخ حکم خطر دسترسی به برنامه | تفسیر |
---|---|
appsDetected: ["KNOWN_INSTALLED"] | فقط برنامههایی نصب شدهاند که توسط Google Play شناسایی شده یا توسط سازنده دستگاه روی پارتیشن سیستم از قبل بارگذاری شدهاند. هیچ برنامهای در حال اجرا نیست که منجر به احکام ضبط، کنترل یا همپوشانی شود. |
appsDetected: ["KNOWN_INSTALLED", "UNKNOWN_INSTALLED", "UNKNOWN_CAPTURING"] | برنامههایی وجود دارند که توسط Google Play نصب شده یا توسط سازنده دستگاه روی پارتیشن سیستم از قبل بارگذاری شدهاند. برنامههای دیگری در حال اجرا هستند و مجوزهایی فعال دارند که میتوان از آنها برای مشاهده صفحه یا گرفتن ورودیها و خروجیهای دیگر استفاده کرد. |
appsDetected: ["KNOWN_INSTALLED", "KNOWN_CAPTURING", "UNKNOWN_INSTALLED", "UNKNOWN_CONTROLLING"] | Play یا سیستمی در حال اجرا هستند که دارای مجوزهایی فعال هستند که می توانند برای مشاهده صفحه یا گرفتن ورودی ها و خروجی های دیگر استفاده شوند. همچنین برنامه های دیگری در حال اجرا هستند که دارای مجوزهای فعال هستند که می توانند برای کنترل دستگاه و کنترل مستقیم ورودی های برنامه شما استفاده شوند. |
appAccessRiskVerdict: {} | خطر دسترسی به برنامه ارزیابی نمی شود زیرا یک نیاز ضروری از قلم افتاده است. به عنوان مثال، دستگاه به اندازه کافی قابل اعتماد نبود. |
بسته به سطح ریسک خود، می توانید تصمیم بگیرید که چه ترکیبی از احکام قابل قبول است و در مورد چه احکامی می خواهید اقدام کنید. قطعه کد زیر نمونه ای از تأیید این موضوع را نشان می دهد که هیچ برنامه ای در حال اجرا نیست که بتواند صفحه نمایش را بگیرد یا برنامه شما را کنترل کند:
کاتلین
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! } }
جاوا
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! } }
احکام خطر دسترسی به برنامه را اصلاح کنید
بسته به سطح خطر خود، میتوانید تصمیم بگیرید قبل از اینکه کاربر درخواست یا اقدامی را انجام دهد، تصمیم بگیرید که میخواهید در مورد چه برنامههایی اقدام کنید. درخواستهای اختیاری Google Play وجود دارد که میتوانید پس از بررسی حکم خطر دسترسی برنامه به کاربر نشان دهید. میتوانید CLOSE_UNKNOWN_ACCESS_RISK را نشان دهید تا از کاربر بخواهید برنامههای ناشناختهای را که باعث خطر دسترسی به برنامه میشوند ببندد یا میتوانید CLOSE_ALL_ACCESS_RISK را نشان دهید تا از کاربر بخواهید همه برنامهها (معروف و ناشناخته) را که باعث حکم خطر دسترسی به برنامه میشوند ببندد.
حکم Play Protect
پس از فعال شدن، فیلد environmentDetails
در محموله Play Integrity API حاوی حکم Play Protect خواهد بود:
environmentDetails: {
playProtectVerdict: "NO_ISSUES"
}
playProtectVerdict
می تواند یکی از مقادیر زیر را داشته باشد:
-
NO_ISSUES
- Play Protect روشن است و هیچ مشکلی در برنامه در دستگاه پیدا نکرد.
-
NO_DATA
- Play Protect روشن است اما هنوز هیچ اسکنی انجام نشده است. ممکن است دستگاه یا برنامه Play Store اخیراً بازنشانی شده باشد.
-
POSSIBLE_RISK
- Play Protect خاموش است.
-
MEDIUM_RISK
- Play Protect روشن است و برنامههای بالقوه مضر را روی دستگاه نصب کرده است.
-
HIGH_RISK
- Play Protect روشن است و برنامههای خطرناکی را روی دستگاه نصب کرده است.
-
UNEVALUATED
حکم Play Protect ارزیابی نشد.
این ممکن است به دلایل مختلفی رخ دهد، از جمله موارد زیر:
- دستگاه به اندازه کافی قابل اعتماد نیست.
- فقط بازی ها : حساب کاربری مجوز Play برای بازی ندارد.
راهنمای استفاده از حکم Play Protect
سرور پشتیبان برنامه شما می تواند تصمیم بگیرد که بر اساس حکم بر اساس میزان تحمل ریسک شما چگونه عمل کند. در اینجا چند پیشنهاد و اقدامات بالقوه کاربر آورده شده است:
-
NO_ISSUES
- Play Protect روشن است و هیچ مشکلی پیدا نکرده است، بنابراین نیازی به اقدام کاربر نیست.
-
POSSIBLE_RISK
وNO_DATA
- هنگام دریافت این احکام، از کاربر بخواهید بررسی کند که Play Protect روشن است و اسکن انجام داده است.
NO_DATA
باید فقط در شرایط نادر ظاهر شود. -
MEDIUM_RISK
وHIGH_RISK
- بسته به میزان تحمل ریسک، میتوانید از کاربر بخواهید که Play Protect را راهاندازی کند و نسبت به هشدارهای Play Protect اقدام کند. اگر کاربر نمی تواند این الزامات را برآورده کند، می توانید آنها را از عملکرد سرور مسدود کنید.