সততার রায়

এই পৃষ্ঠাটি বর্ণনা করে যে কিভাবে ব্যাখ্যা করা যায় এবং ফিরে আসা অখণ্ডতার রায়ের সাথে কাজ করা যায়। আপনি একটি স্ট্যান্ডার্ড বা ক্লাসিক 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"
}

এই মানগুলি মূল অনুরোধের সাথে মেলে। তাই, JSON পেলোডের requestDetails অংশ যাচাই করে নিশ্চিত করুন যে requestPackageName এবং requestHash মূল অনুরোধে যা পাঠানো হয়েছে তার সাথে মেলে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন

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"
}

এই মানগুলি মূল অনুরোধের সাথে মেলে। অতএব, JSON পেলোডের requestDetails অংশ যাচাই করুন যাতে নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে, মূল অনুরোধে যা পাঠানো হয়েছে তার সাথে requestPackageName এবং মেলে nonce :

কোটলিন

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-চালিত ডিভাইসে চলছে৷ ডিভাইসটি সিস্টেম ইন্টিগ্রিটি চেক পাস করে এবং 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 Console-এ Play Integrity API পরীক্ষা তৈরি করতে পারেন।

শর্তাধীন ডিভাইস লেবেল

যদি আপনার অ্যাপটি PC-এর জন্য Google Play Games- এ প্রকাশ করা হয়, তাহলে deviceRecognitionVerdict নিম্নলিখিত লেবেলও থাকতে পারে:

MEETS_VIRTUAL_INTEGRITY
অ্যাপটি Google Play পরিষেবাগুলির সাথে একটি Android-চালিত এমুলেটরে চলছে৷ এমুলেটর সিস্টেম অখণ্ডতা পরীক্ষা পাস করে এবং মূল Android সামঞ্জস্যের প্রয়োজনীয়তা পূরণ করে।

ঐচ্ছিক ডিভাইস তথ্য এবং ডিভাইস রিকল

আপনি যদি অখণ্ডতার রায়ে অতিরিক্ত লেবেল পেতে বেছে নেন , তাহলে deviceRecognitionVerdict নিম্নলিখিত অতিরিক্ত লেবেল থাকতে পারে:

MEETS_BASIC_INTEGRITY
অ্যাপটি এমন একটি ডিভাইসে চলছে যা মৌলিক সিস্টেম ইন্টিগ্রিটি চেক পাস করে এবং অ্যান্ড্রয়েড 13 বা তার পরবর্তী ডিভাইসের জন্য অ্যান্ড্রয়েড প্ল্যাটফর্ম কী প্রত্যয়ন প্রয়োজন। ডিভাইসটি Android সামঞ্জস্যের প্রয়োজনীয়তা পূরণ নাও করতে পারে এবং Google Play পরিষেবাগুলি চালানোর জন্য অনুমোদিত নাও হতে পারে৷ উদাহরণস্বরূপ, ডিভাইসটি Android এর একটি অচেনা সংস্করণ চালাতে পারে, একটি আনলক করা বুটলোডার থাকতে পারে, বুটটি যাচাই করা হয়নি বা প্রস্তুতকারকের দ্বারা প্রত্যয়িত নাও থাকতে পারে৷
MEETS_STRONG_INTEGRITY
অ্যাপটি Google Play পরিষেবাগুলির সাথে একটি Android-চালিত ডিভাইসে চলছে এবং সিস্টেমের অখণ্ডতার একটি দৃঢ় গ্যারান্টি রয়েছে যেমন বুট অখণ্ডতার একটি হার্ডওয়্যার-সমর্থিত প্রমাণ এবং Android 13 বা তার পরবর্তী ডিভাইসগুলির জন্য গত বছরে একটি নিরাপত্তা আপডেট থাকা প্রয়োজন৷ ডিভাইসটি সিস্টেম ইন্টিগ্রিটি চেক পাস করে এবং Android সামঞ্জস্যের প্রয়োজনীয়তা পূরণ করে।

একটি একক ডিভাইস ডিভাইসের অখণ্ডতার রায়ে একাধিক ডিভাইস লেবেল ফিরিয়ে দেবে যদি লেবেলের প্রতিটি মানদণ্ড পূরণ করা হয়।

ডিভাইসের বৈশিষ্ট্য

আপনি ডিভাইসের বৈশিষ্ট্যগুলিতেও নির্বাচন করতে পারেন, যা ডিভাইসে চলমান Android OS এর Android SDK সংস্করণকে বলে৷ ভবিষ্যতে, এটি অন্যান্য ডিভাইস বৈশিষ্ট্যগুলির সাথে প্রসারিত হতে পারে।

SDK সংস্করণের মান হল Android SDK সংস্করণ নম্বর যা Build.VERSION_CODES এ সংজ্ঞায়িত করা হয়েছে। একটি প্রয়োজনীয় প্রয়োজনীয়তা মিস হলে SDK সংস্করণটি মূল্যায়ন করা হয় না। এই ক্ষেত্রে, sdkVersion ক্ষেত্রটি সেট করা নেই; এইভাবে, deviceAttributes ক্ষেত্রটি খালি। এটি ঘটতে পারে কারণ:

  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • ডিভাইসে প্রযুক্তিগত সমস্যা ছিল।

আপনি যদি 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.
}

সাম্প্রতিক ডিভাইস কার্যকলাপ

আপনি সাম্প্রতিক ডিভাইস ক্রিয়াকলাপও বেছে নিতে পারেন, যা আপনাকে বলে যে আপনার অ্যাপটি গত ঘন্টায় কতবার একটি নির্দিষ্ট ডিভাইসে একটি অখণ্ডতা টোকেন অনুরোধ করেছে৷ আপনি অপ্রত্যাশিত, হাইপারঅ্যাকটিভ ডিভাইসগুলির বিরুদ্ধে আপনার অ্যাপকে রক্ষা করতে সাম্প্রতিক ডিভাইস কার্যকলাপ ব্যবহার করতে পারেন যা একটি সক্রিয় আক্রমণের ইঙ্গিত হতে পারে। আপনি প্রতি ঘন্টায় একটি অখণ্ডতা টোকেন অনুরোধ করার জন্য একটি সাধারণ ডিভাইসে কতবার আপনার অ্যাপ ইনস্টল করার আশা করছেন তার উপর ভিত্তি করে আপনি প্রতিটি সাম্প্রতিক ডিভাইসের কার্যকলাপের স্তরে কতটা বিশ্বাস করবেন তা নির্ধারণ করতে পারেন।

আপনি যদি recentDeviceActivity অ্যাক্টিভিটি পাওয়ার জন্য নির্বাচন করেন তবে deviceIntegrity ক্ষেত্রের দুটি মান থাকবে:

deviceIntegrity: {
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
  recentDeviceActivity: {
    // "LEVEL_2" is one of several possible values.
    deviceActivityLevel: "LEVEL_2"
  }
}

deviceActivityLevel সংজ্ঞাগুলি মোডগুলির মধ্যে আলাদা এবং নিম্নলিখিত মানগুলির মধ্যে একটি থাকতে পারে:

সাম্প্রতিক ডিভাইস কার্যকলাপ স্তর এই ডিভাইসে প্রতি অ্যাপের শেষ ঘণ্টায় স্ট্যান্ডার্ড API ইন্টিগ্রিটি টোকেন অনুরোধ এই ডিভাইসে ক্লাসিক এপিআই ইন্টিগ্রিটি টোকেন অনুরোধ প্রতি অ্যাপের শেষ ঘণ্টায়
LEVEL_1 (সর্বনিম্ন) 10 বা তার কম 5 বা তার কম
LEVEL_2 11 থেকে 25 এর মধ্যে 6 থেকে 10 এর মধ্যে
LEVEL_3 26 থেকে 50 এর মধ্যে 11 এবং 15 এর মধ্যে
LEVEL_4 (সর্বোচ্চ) 50 এর বেশি 15 এর বেশি
UNEVALUATED সাম্প্রতিক ডিভাইস কার্যকলাপ মূল্যায়ন করা হয়নি. এটি ঘটতে পারে কারণ:
  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • ডিভাইসে ইনস্টল করা আপনার অ্যাপের সংস্করণ Google Play-এর কাছে অজানা।
  • ডিভাইসে প্রযুক্তিগত সমস্যা।

ডিভাইস রিকল (বিটা)

আপনি ডিভাইস রিকল এও অপ্ট-ইন করতে পারেন, যা আপনাকে নির্দিষ্ট ডিভাইসের সাথে কিছু কাস্টম, প্রতি-ডিভাইস ডেটা সঞ্চয় করতে দেয় যা আপনার অ্যাপটি একই ডিভাইসে আবার ইনস্টল করা হলে আপনি নির্ভরযোগ্যভাবে পুনরুদ্ধার করতে পারবেন। একটি অখণ্ডতা টোকেন অনুরোধ করার পরে, আপনি একটি নির্দিষ্ট ডিভাইসের জন্য ডিভাইস রিকল মান পরিবর্তন করতে একটি পৃথক সার্ভার-টু-সার্ভার কল করেন।

আপনি deviceRecall রিকল নির্বাচন করলে, deviceIntegrity ফিল্ডে ডিভাইস রিকল তথ্য থাকবে যা আপনি নির্দিষ্ট ডিভাইসের জন্য সেট করেছেন:

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_DEVICE_INTEGRITY"],
  "deviceRecall": {
    "values": {
      "bitFirst": true,
      "bitSecond": false,
      "bitThird": true
    },
    "writeDates": {
      // Write time in YYYYMM format in UTC.
      "yyyymmFirst": 202401,
      // Note that yyyymmSecond is not set because bitSecond is false.
      "yyyymmThird": 202310
    }
  }
}

deviceRecall দুটি ক্ষেত্রে বিভক্ত:

  • values : আপনি এই ডিভাইসের জন্য পূর্বে সেট করা বিট মানগুলি স্মরণ করুন৷
  • writeDates : ইউটিসি-তে বিট লেখার তারিখগুলি বছর এবং মাসের জন্য সঠিকভাবে স্মরণ করুন। একটি প্রত্যাহার বিটের লেখার তারিখ প্রতিবার বিটটি true হিসাবে সেট করা হলে আপডেট করা হবে এবং বিটটি false সেট করা হলে তা সরানো হবে।

ডিভাইস রিকল তথ্য অনুপলব্ধ হলে, ডিভাইস রিকল মান খালি থাকবে:

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_DEVICE_INTEGRITY"],
  "deviceRecall": {
    "values": {},
    "writeDates": {}
  }
}

অ্যাকাউন্টের বিবরণ ক্ষেত্র

accountDetails ক্ষেত্রটিতে একটি একক মান রয়েছে, appLicensingVerdict , যা ডিভাইসে সাইন ইন করা ব্যবহারকারীর অ্যাকাউন্টের জন্য অ্যাপের Google 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 সক্ষম আছে কিনা এবং এটি পরিচিত ম্যালওয়্যার খুঁজে পেয়েছে কিনা।

আপনি যদি আপনার Google Play Console-এ অ্যাপ অ্যাক্সেস ঝুঁকি রায় বা Play Protect রায় বেছে নিয়ে থাকেন, তাহলে আপনার API প্রতিক্রিয়া environmentDetails ক্ষেত্র অন্তর্ভুক্ত করবে। environmentDetails ক্ষেত্রে দুটি মান থাকতে পারে, appAccessRiskVerdict এবং playProtectVerdict

অ্যাপ অ্যাক্সেস ঝুঁকি রায়

একবার সক্ষম হয়ে গেলে, Play Integrity API পেলোডে environmentDetails ক্ষেত্রটিতে নতুন অ্যাপ অ্যাক্সেস ঝুঁকির রায় থাকবে।

{
  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 ক্ষেত্র অ্যাপ রয়েছে। এই প্রতিক্রিয়াগুলি সনাক্ত করা অ্যাপগুলির ইনস্টল উত্সের উপর নির্ভর করে নিম্নলিখিত দুটি গ্রুপের মধ্যে একটিতে পড়ে:

  • প্লে বা সিস্টেম অ্যাপস : যে অ্যাপগুলি 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-এর কাছে অজানা।
  • ডিভাইসটিতে গুগল প্লে স্টোরের সংস্করণটি পুরানো।
  • শুধুমাত্র গেমস : ব্যবহারকারীর অ্যাকাউন্টের গেমের জন্য প্লে লাইসেন্স নেই।
  • verdictOptOut প্যারামিটারের সাথে একটি আদর্শ অনুরোধ ব্যবহার করা হয়েছে।
  • একটি প্লে ইন্টিগ্রিটি এপিআই লাইব্রেরি সংস্করণের সাথে একটি আদর্শ অনুরোধ ব্যবহার করা হয়েছিল যা এখনও মানক অনুরোধগুলির জন্য অ্যাপ অ্যাক্সেস ঝুঁকি সমর্থন করে না।

অ্যাপ অ্যাক্সেস ঝুঁকি স্বয়ংক্রিয়ভাবে যাচাইকৃত অ্যাক্সেসিবিলিটি পরিষেবাগুলিকে বাদ দেয় যেগুলি একটি বর্ধিত Google Play অ্যাক্সেসিবিলিটি পর্যালোচনার মাধ্যমে করা হয়েছে (ডিভাইসের যেকোনো অ্যাপ স্টোর দ্বারা ইনস্টল করা হয়েছে)। "বাদ দেওয়া" এর অর্থ হল ডিভাইসে চলমান যাচাইকৃত অ্যাক্সেসিবিলিটি পরিষেবাগুলি অ্যাপ অ্যাক্সেসের ঝুঁকির রায়ে ক্যাপচারিং, নিয়ন্ত্রণ বা ওভারলে প্রতিক্রিয়া প্রদান করবে না। আপনার অ্যাক্সেসিবিলিটি অ্যাপ্লিকেশানের জন্য একটি বর্ধিত Google Play অ্যাক্সেসিবিলিটি পর্যালোচনার অনুরোধ করতে, আপনার অ্যাপ্লিকেশানের ম্যানিফেস্টে isAccessibilityTool পতাকা সেট করা আছে কিনা তা নিশ্চিত করে এটিকে Google Play-এ প্রকাশ করুন বা একটি পর্যালোচনার অনুরোধ করুন

নিম্নলিখিত সারণী রায়ের কিছু উদাহরণ দেয় এবং সেগুলি কী বোঝায় (এই টেবিলটি প্রতিটি সম্ভাব্য ফলাফল তালিকাভুক্ত করে না):

উদাহরণ অ্যাপ অ্যাক্সেস ঝুঁকি রায় প্রতিক্রিয়া ব্যাখ্যা
appsDetected:
["KNOWN_INSTALLED"]
শুধুমাত্র এমন অ্যাপ ইনস্টল করা আছে যেগুলি Google Play দ্বারা স্বীকৃত বা ডিভাইস নির্মাতার দ্বারা সিস্টেম পার্টিশনে প্রিলোড করা হয়েছে।
এমন কোন অ্যাপ চলছে না যার ফলে ক্যাপচারিং, কন্ট্রোলিং বা ওভারলে রায় হবে।
appsDetected:
["KNOWN_INSTALLED",
"UNKNOWN_INSTALLED",
"UNKNOWN_CAPTURING"]
ডিভাইস নির্মাতার দ্বারা সিস্টেম পার্টিশনে Google Play দ্বারা ইনস্টল করা বা প্রিলোড করা অ্যাপ রয়েছে৷
অন্যান্য অ্যাপ চালু আছে এবং অনুমতিগুলি সক্ষম করা আছে যা স্ক্রীন দেখতে বা অন্যান্য ইনপুট এবং আউটপুট ক্যাপচার করতে ব্যবহার করা যেতে পারে।
appsDetected:
["KNOWN_INSTALLED",
"KNOWN_CAPTURING",
"UNKNOWN_INSTALLED",
"UNKNOWN_CONTROLLING"]
এমন প্লে বা সিস্টেম চালু আছে যেগুলির অনুমতিগুলি সক্রিয় রয়েছে যা স্ক্রীন দেখতে বা অন্যান্য ইনপুট এবং আউটপুটগুলি ক্যাপচার করতে ব্যবহার করা যেতে পারে৷
এছাড়াও অন্যান্য অ্যাপ্লিকেশানগুলি চলমান রয়েছে যেগুলির অনুমতিগুলি সক্রিয় রয়েছে যা ডিভাইস নিয়ন্ত্রণ করতে এবং সরাসরি আপনার অ্যাপে ইনপুটগুলি নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে৷
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 Integrity API পেলোডে environmentDetails ক্ষেত্রটিতে Play Protect রায় থাকবে:

environmentDetails: {
  playProtectVerdict: "NO_ISSUES"
}

playProtectVerdict নিম্নলিখিত মানগুলির মধ্যে একটি থাকতে পারে:

NO_ISSUES
Play Protect চালু আছে এবং ডিভাইসে কোনো অ্যাপ সমস্যা খুঁজে পায়নি।
NO_DATA
Play Protect চালু আছে কিন্তু এখনও কোনো স্ক্যান করা হয়নি। ডিভাইস বা প্লে স্টোর অ্যাপটি হয়তো সম্প্রতি রিসেট করা হয়েছে।
POSSIBLE_RISK
Play Protect বন্ধ করা আছে।
MEDIUM_RISK
Play Protect চালু আছে এবং ডিভাইসে সম্ভাব্য ক্ষতিকারক অ্যাপ ইনস্টল করা আছে।
HIGH_RISK
Play Protect চালু আছে এবং ডিভাইসে বিপজ্জনক অ্যাপ ইনস্টল করা আছে।
UNEVALUATED

Play Protect রায়ের মূল্যায়ন করা হয়নি।

এটি নিম্নলিখিত সহ বিভিন্ন কারণে ঘটতে পারে:

  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • শুধুমাত্র গেমস : ব্যবহারকারীর অ্যাকাউন্টের গেমের জন্য প্লে লাইসেন্স নেই।

Play Protect ব্যবহার করার বিষয়ে নির্দেশিকা

আপনার অ্যাপ্লিকেশানের ব্যাকএন্ড সার্ভার আপনার ঝুঁকি সহনশীলতার উপর ভিত্তি করে রায়ের উপর ভিত্তি করে কীভাবে কাজ করবে তা সিদ্ধান্ত নিতে পারে। এখানে কিছু পরামর্শ এবং সম্ভাব্য ব্যবহারকারীর পদক্ষেপ রয়েছে:

NO_ISSUES
Play Protect চালু আছে এবং কোনো সমস্যা খুঁজে পায়নি তাই ব্যবহারকারীর কোনো পদক্ষেপের প্রয়োজন নেই।
POSSIBLE_RISK এবং NO_DATA
এই রায়গুলি পাওয়ার সময়, ব্যবহারকারীকে Play Protect চালু আছে এবং একটি স্ক্যান করা হয়েছে তা পরীক্ষা করতে বলুন। NO_DATA শুধুমাত্র বিরল পরিস্থিতিতে উপস্থিত হওয়া উচিত৷
MEDIUM_RISK এবং HIGH_RISK
আপনার ঝুঁকি সহনশীলতার উপর নির্ভর করে, আপনি ব্যবহারকারীকে Play Protect চালু করতে এবং Play Protect সতর্কতার বিষয়ে পদক্ষেপ নিতে বলতে পারেন। ব্যবহারকারী যদি এই প্রয়োজনীয়তাগুলি পূরণ করতে না পারে তবে আপনি তাদের সার্ভার অ্যাকশন থেকে ব্লক করতে পারেন।
,

এই পৃষ্ঠাটি বর্ণনা করে যে কিভাবে ব্যাখ্যা করা যায় এবং ফিরে আসা অখণ্ডতার রায়ের সাথে কাজ করা যায়। আপনি একটি স্ট্যান্ডার্ড বা ক্লাসিক 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"
}

এই মানগুলি মূল অনুরোধের সাথে মেলে। তাই, JSON পেলোডের requestDetails অংশ যাচাই করে নিশ্চিত করুন যে requestPackageName এবং requestHash মূল অনুরোধে যা পাঠানো হয়েছে তার সাথে মেলে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন

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"
}

এই মানগুলি মূল অনুরোধের সাথে মেলে। অতএব, JSON পেলোডের requestDetails অংশ যাচাই করুন যাতে নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে, মূল অনুরোধে যা পাঠানো হয়েছে তার সাথে requestPackageName এবং মেলে nonce :

কোটলিন

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-চালিত ডিভাইসে চলছে৷ ডিভাইসটি সিস্টেম ইন্টিগ্রিটি চেক পাস করে এবং 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 Console-এ Play Integrity API পরীক্ষা তৈরি করতে পারেন।

শর্তাধীন ডিভাইস লেবেল

যদি আপনার অ্যাপটি PC-এর জন্য Google Play Games- এ প্রকাশ করা হয়, তাহলে deviceRecognitionVerdict নিম্নলিখিত লেবেলও থাকতে পারে:

MEETS_VIRTUAL_INTEGRITY
অ্যাপটি Google Play পরিষেবাগুলির সাথে একটি Android-চালিত এমুলেটরে চলছে৷ এমুলেটর সিস্টেম অখণ্ডতা পরীক্ষা পাস করে এবং মূল Android সামঞ্জস্যের প্রয়োজনীয়তা পূরণ করে।

ঐচ্ছিক ডিভাইস তথ্য এবং ডিভাইস রিকল

আপনি যদি অখণ্ডতার রায়ে অতিরিক্ত লেবেল পেতে বেছে নেন , তাহলে deviceRecognitionVerdict নিম্নলিখিত অতিরিক্ত লেবেল থাকতে পারে:

MEETS_BASIC_INTEGRITY
অ্যাপটি এমন একটি ডিভাইসে চলছে যা মৌলিক সিস্টেম ইন্টিগ্রিটি চেক পাস করে এবং অ্যান্ড্রয়েড 13 বা তার পরবর্তী ডিভাইসের জন্য অ্যান্ড্রয়েড প্ল্যাটফর্ম কী প্রত্যয়ন প্রয়োজন। ডিভাইসটি Android সামঞ্জস্যের প্রয়োজনীয়তা পূরণ নাও করতে পারে এবং Google Play পরিষেবাগুলি চালানোর জন্য অনুমোদিত নাও হতে পারে৷ উদাহরণস্বরূপ, ডিভাইসটি Android এর একটি অচেনা সংস্করণ চালাতে পারে, একটি আনলক করা বুটলোডার থাকতে পারে, বুটটি যাচাই করা হয়নি বা প্রস্তুতকারকের দ্বারা প্রত্যয়িত নাও থাকতে পারে৷
MEETS_STRONG_INTEGRITY
অ্যাপটি Google Play পরিষেবাগুলির সাথে একটি Android-চালিত ডিভাইসে চলছে এবং সিস্টেমের অখণ্ডতার একটি দৃঢ় গ্যারান্টি রয়েছে যেমন বুট অখণ্ডতার একটি হার্ডওয়্যার-সমর্থিত প্রমাণ এবং Android 13 বা তার পরবর্তী ডিভাইসগুলির জন্য গত বছরে একটি নিরাপত্তা আপডেট থাকা প্রয়োজন৷ ডিভাইসটি সিস্টেম ইন্টিগ্রিটি চেক পাস করে এবং Android সামঞ্জস্যের প্রয়োজনীয়তা পূরণ করে।

একটি একক ডিভাইস ডিভাইসের অখণ্ডতার রায়ে একাধিক ডিভাইস লেবেল ফিরিয়ে দেবে যদি লেবেলের প্রতিটি মানদণ্ড পূরণ করা হয়।

ডিভাইসের বৈশিষ্ট্য

আপনি ডিভাইসের বৈশিষ্ট্যগুলিতেও নির্বাচন করতে পারেন, যা ডিভাইসে চলমান Android OS এর Android SDK সংস্করণকে বলে৷ ভবিষ্যতে, এটি অন্যান্য ডিভাইস বৈশিষ্ট্যগুলির সাথে প্রসারিত হতে পারে।

SDK সংস্করণের মান হল Android SDK সংস্করণ নম্বর যা Build.VERSION_CODES এ সংজ্ঞায়িত করা হয়েছে। একটি প্রয়োজনীয় প্রয়োজনীয়তা মিস হলে SDK সংস্করণটি মূল্যায়ন করা হয় না। এই ক্ষেত্রে, sdkVersion ক্ষেত্রটি সেট করা নেই; এইভাবে, deviceAttributes ক্ষেত্রটি খালি। এটি ঘটতে পারে কারণ:

  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • ডিভাইসে প্রযুক্তিগত সমস্যা ছিল।

আপনি যদি 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.
}

সাম্প্রতিক ডিভাইস কার্যকলাপ

আপনি সাম্প্রতিক ডিভাইস ক্রিয়াকলাপও বেছে নিতে পারেন, যা আপনাকে বলে যে আপনার অ্যাপটি গত ঘন্টায় কতবার একটি নির্দিষ্ট ডিভাইসে একটি অখণ্ডতা টোকেন অনুরোধ করেছে৷ আপনি অপ্রত্যাশিত, হাইপারঅ্যাকটিভ ডিভাইসগুলির বিরুদ্ধে আপনার অ্যাপকে রক্ষা করতে সাম্প্রতিক ডিভাইস কার্যকলাপ ব্যবহার করতে পারেন যা একটি সক্রিয় আক্রমণের ইঙ্গিত হতে পারে। আপনি প্রতি ঘন্টায় একটি অখণ্ডতা টোকেন অনুরোধ করার জন্য একটি সাধারণ ডিভাইসে কতবার আপনার অ্যাপ ইনস্টল করার আশা করছেন তার উপর ভিত্তি করে আপনি প্রতিটি সাম্প্রতিক ডিভাইসের কার্যকলাপের স্তরে কতটা বিশ্বাস করবেন তা নির্ধারণ করতে পারেন।

আপনি যদি recentDeviceActivity অ্যাক্টিভিটি পাওয়ার জন্য নির্বাচন করেন তবে deviceIntegrity ক্ষেত্রের দুটি মান থাকবে:

deviceIntegrity: {
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
  recentDeviceActivity: {
    // "LEVEL_2" is one of several possible values.
    deviceActivityLevel: "LEVEL_2"
  }
}

deviceActivityLevel সংজ্ঞাগুলি মোডগুলির মধ্যে আলাদা এবং নিম্নলিখিত মানগুলির মধ্যে একটি থাকতে পারে:

সাম্প্রতিক ডিভাইস কার্যকলাপ স্তর এই ডিভাইসে প্রতি অ্যাপের শেষ ঘণ্টায় স্ট্যান্ডার্ড API ইন্টিগ্রিটি টোকেন অনুরোধ এই ডিভাইসে ক্লাসিক এপিআই ইন্টিগ্রিটি টোকেন অনুরোধ প্রতি অ্যাপের শেষ ঘণ্টায়
LEVEL_1 (সর্বনিম্ন) 10 বা তার কম 5 বা তার কম
LEVEL_2 11 থেকে 25 এর মধ্যে 6 থেকে 10 এর মধ্যে
LEVEL_3 26 থেকে 50 এর মধ্যে 11 এবং 15 এর মধ্যে
LEVEL_4 (সর্বোচ্চ) 50 এর বেশি 15 এর বেশি
UNEVALUATED সাম্প্রতিক ডিভাইস কার্যকলাপ মূল্যায়ন করা হয়নি. এটি ঘটতে পারে কারণ:
  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • ডিভাইসে ইনস্টল করা আপনার অ্যাপের সংস্করণ Google Play-এর কাছে অজানা।
  • ডিভাইসে প্রযুক্তিগত সমস্যা।

ডিভাইস রিকল (বিটা)

আপনি ডিভাইস রিকল এও অপ্ট-ইন করতে পারেন, যা আপনাকে নির্দিষ্ট ডিভাইসের সাথে কিছু কাস্টম, প্রতি-ডিভাইস ডেটা সঞ্চয় করতে দেয় যা আপনার অ্যাপটি একই ডিভাইসে আবার ইনস্টল করা হলে আপনি নির্ভরযোগ্যভাবে পুনরুদ্ধার করতে পারবেন। একটি অখণ্ডতা টোকেন অনুরোধ করার পরে, আপনি একটি নির্দিষ্ট ডিভাইসের জন্য ডিভাইস রিকল মান পরিবর্তন করতে একটি পৃথক সার্ভার-টু-সার্ভার কল করেন।

আপনি deviceRecall রিকল নির্বাচন করলে, deviceIntegrity ফিল্ডে ডিভাইস রিকল তথ্য থাকবে যা আপনি নির্দিষ্ট ডিভাইসের জন্য সেট করেছেন:

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_DEVICE_INTEGRITY"],
  "deviceRecall": {
    "values": {
      "bitFirst": true,
      "bitSecond": false,
      "bitThird": true
    },
    "writeDates": {
      // Write time in YYYYMM format in UTC.
      "yyyymmFirst": 202401,
      // Note that yyyymmSecond is not set because bitSecond is false.
      "yyyymmThird": 202310
    }
  }
}

deviceRecall দুটি ক্ষেত্রে বিভক্ত:

  • values : আপনি এই ডিভাইসের জন্য পূর্বে সেট করা বিট মানগুলি স্মরণ করুন৷
  • writeDates : ইউটিসি-তে বিট লেখার তারিখগুলি বছর এবং মাসের জন্য সঠিকভাবে স্মরণ করুন। একটি প্রত্যাহার বিটের লেখার তারিখ প্রতিবার বিটটি true হিসাবে সেট করা হলে আপডেট করা হবে এবং বিটটি false সেট করা হলে তা সরানো হবে।

ডিভাইস রিকল তথ্য অনুপলব্ধ হলে, ডিভাইস রিকল মান খালি থাকবে:

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_DEVICE_INTEGRITY"],
  "deviceRecall": {
    "values": {},
    "writeDates": {}
  }
}

অ্যাকাউন্টের বিবরণ ক্ষেত্র

accountDetails ক্ষেত্রটিতে একটি একক মান রয়েছে, appLicensingVerdict , যা ডিভাইসে সাইন ইন করা ব্যবহারকারীর অ্যাকাউন্টের জন্য অ্যাপের Google 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 সক্ষম আছে কিনা এবং এটি পরিচিত ম্যালওয়্যার খুঁজে পেয়েছে কিনা।

আপনি যদি আপনার Google Play Console-এ অ্যাপ অ্যাক্সেস ঝুঁকি রায় বা Play Protect রায় বেছে নিয়ে থাকেন, তাহলে আপনার API প্রতিক্রিয়া environmentDetails ক্ষেত্র অন্তর্ভুক্ত করবে। environmentDetails ক্ষেত্রে দুটি মান থাকতে পারে, appAccessRiskVerdict এবং playProtectVerdict

অ্যাপ অ্যাক্সেস ঝুঁকি রায়

একবার সক্ষম হয়ে গেলে, Play Integrity API পেলোডে environmentDetails ক্ষেত্রটিতে নতুন অ্যাপ অ্যাক্সেস ঝুঁকির রায় থাকবে।

{
  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 ক্ষেত্র অ্যাপ রয়েছে। এই প্রতিক্রিয়াগুলি সনাক্ত করা অ্যাপগুলির ইনস্টল উত্সের উপর নির্ভর করে নিম্নলিখিত দুটি গ্রুপের মধ্যে একটিতে পড়ে:

  • প্লে বা সিস্টেম অ্যাপস : যে অ্যাপগুলি 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-এর কাছে অজানা।
  • ডিভাইসটিতে গুগল প্লে স্টোরের সংস্করণটি পুরানো।
  • শুধুমাত্র গেমস : ব্যবহারকারীর অ্যাকাউন্টের গেমের জন্য প্লে লাইসেন্স নেই।
  • verdictOptOut প্যারামিটারের সাথে একটি আদর্শ অনুরোধ ব্যবহার করা হয়েছে।
  • একটি প্লে ইন্টিগ্রিটি এপিআই লাইব্রেরি সংস্করণের সাথে একটি আদর্শ অনুরোধ ব্যবহার করা হয়েছিল যা এখনও মানক অনুরোধগুলির জন্য অ্যাপ অ্যাক্সেস ঝুঁকি সমর্থন করে না।

অ্যাপ অ্যাক্সেস ঝুঁকি স্বয়ংক্রিয়ভাবে যাচাইকৃত অ্যাক্সেসিবিলিটি পরিষেবাগুলিকে বাদ দেয় যেগুলি একটি বর্ধিত Google Play অ্যাক্সেসিবিলিটি পর্যালোচনার মাধ্যমে করা হয়েছে (ডিভাইসের যেকোনো অ্যাপ স্টোর দ্বারা ইনস্টল করা হয়েছে)। "বাদ দেওয়া" এর অর্থ হল ডিভাইসে চলমান যাচাইকৃত অ্যাক্সেসিবিলিটি পরিষেবাগুলি অ্যাপ অ্যাক্সেসের ঝুঁকির রায়ে ক্যাপচারিং, নিয়ন্ত্রণ বা ওভারলে প্রতিক্রিয়া প্রদান করবে না। আপনার অ্যাক্সেসিবিলিটি অ্যাপ্লিকেশানের জন্য একটি বর্ধিত Google Play অ্যাক্সেসিবিলিটি পর্যালোচনার অনুরোধ করতে, আপনার অ্যাপ্লিকেশানের ম্যানিফেস্টে isAccessibilityTool পতাকা সেট করা আছে কিনা তা নিশ্চিত করে এটিকে Google Play-এ প্রকাশ করুন বা একটি পর্যালোচনার অনুরোধ করুন

নিম্নলিখিত সারণী রায়ের কিছু উদাহরণ দেয় এবং সেগুলি কী বোঝায় (এই টেবিলটি প্রতিটি সম্ভাব্য ফলাফল তালিকাভুক্ত করে না):

উদাহরণ অ্যাপ অ্যাক্সেস ঝুঁকি রায় প্রতিক্রিয়া ব্যাখ্যা
appsDetected:
["KNOWN_INSTALLED"]
কেবলমাত্র এমন অ্যাপস ইনস্টল করা আছে যা গুগল প্লে দ্বারা স্বীকৃত বা ডিভাইস প্রস্তুতকারকের দ্বারা সিস্টেম পার্টিশনে প্রিললোড করা হয়েছে।
এমন কোনও অ্যাপ্লিকেশন চলমান নেই যার ফলস্বরূপ ক্যাপচারিং, নিয়ন্ত্রণ করা বা ওভারলেস রায় হবে।
appsDetected:
["KNOWN_INSTALLED",
"UNKNOWN_INSTALLED",
"UNKNOWN_CAPTURING"]
গুগল প্লে দ্বারা ইনস্টল করা অ্যাপ্লিকেশন রয়েছে বা ডিভাইস প্রস্তুতকারকের দ্বারা সিস্টেম পার্টিশনে প্রিলোড করা হয়েছে।
অন্যান্য অ্যাপ্লিকেশনগুলি চলছে এবং অনুমতি রয়েছে যা স্ক্রিনটি দেখতে বা অন্যান্য ইনপুট এবং আউটপুট ক্যাপচার করতে ব্যবহার করা যেতে পারে।
appsDetected:
["KNOWN_INSTALLED",
"KNOWN_CAPTURING",
"UNKNOWN_INSTALLED",
"UNKNOWN_CONTROLLING"]
এমন কিছু প্লে বা সিস্টেম চলছে যা অনুমতিগুলি সক্ষম করে যা স্ক্রিনটি দেখতে বা অন্যান্য ইনপুট এবং আউটপুট ক্যাপচার করতে ব্যবহৃত হতে পারে।
এছাড়াও অন্যান্য অ্যাপ্লিকেশনগুলি চলছে যা অনুমতিগুলি সক্ষম করে যা ডিভাইসটি নিয়ন্ত্রণ করতে এবং সরাসরি আপনার অ্যাপ্লিকেশনটিতে ইনপুটগুলি নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে।
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!
    }
}
প্রতিকার অ্যাপ্লিকেশন অ্যাক্সেস ঝুঁকি রায়

আপনার ঝুঁকির স্তরের উপর নির্ভর করে, আপনি ব্যবহারকারীকে কোনও অনুরোধ বা ক্রিয়া সম্পূর্ণ করার আগে আপনি কোন অ্যাপ অ্যাক্সেসের ঝুঁকিপূর্ণ রায়গুলি পদক্ষেপ নিতে চান তা সিদ্ধান্ত নিতে পারেন। Application চ্ছিক গুগল প্লে প্রম্পট রয়েছে যা অ্যাপ্লিকেশন অ্যাক্সেসের ঝুঁকি রায়টি পরীক্ষা করার পরে আপনি ব্যবহারকারীকে দেখাতে পারেন। আপনি ক্লোজ_অননাউন_অ্যাকসেস_রিস্ককে ব্যবহারকারীকে অ্যাপ্লিকেশন অ্যাক্সেসের ঝুঁকি রায় কারণ হিসাবে অজানা অ্যাপ্লিকেশনগুলি বন্ধ করতে বলার জন্য জিজ্ঞাসা করতে পারেন বা আপনি ক্লোজ_এএল_অ্যাকসেস_রিস্ককে ব্যবহারকারীকে সমস্ত অ্যাপ্লিকেশনগুলি (পরিচিত এবং অজানা) বন্ধ করতে জিজ্ঞাসা করতে পারেন যাতে অ্যাপ্লিকেশন অ্যাক্সেসের ঝুঁকির রায় ঘটায়।

সুরক্ষা রায় রক্ষা করুন

একবার সক্ষম হয়ে গেলে, প্লে ইন্টিগ্রিটি এপিআই পে -লোডে environmentDetails ফিল্ডে প্লে সুরক্ষার রায়টি থাকবে:

environmentDetails: {
  playProtectVerdict: "NO_ISSUES"
}

playProtectVerdict নিম্নলিখিত মানগুলির মধ্যে একটি থাকতে পারে:

NO_ISSUES
প্লে প্রোটেকশন চালু করা হয় এবং ডিভাইসে কোনও অ্যাপ্লিকেশন সমস্যা খুঁজে পায়নি।
NO_DATA
প্লে প্রোটেক্ট চালু আছে তবে এখনও কোনও স্ক্যান করা হয়নি। ডিভাইস বা প্লে স্টোর অ্যাপটি সম্প্রতি পুনরায় সেট করা হতে পারে।
POSSIBLE_RISK
প্লে প্রোটেকশন বন্ধ করা হয়।
MEDIUM_RISK
প্লে প্রোটেকশন চালু করা হয় এবং ডিভাইসে সম্ভাব্য ক্ষতিকারক অ্যাপ্লিকেশনগুলি ইনস্টল করা হয়েছে।
HIGH_RISK
প্লে প্রোটেকশন চালু করা হয় এবং ডিভাইসে বিপজ্জনক অ্যাপ্লিকেশনগুলি ইনস্টল করা হয়েছে।
UNEVALUATED

নাটক সুরক্ষার রায়টি মূল্যায়ন করা হয়নি।

এটি নিম্নলিখিতগুলি সহ বেশ কয়েকটি কারণে ঘটতে পারে:

  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • কেবল গেমস : ব্যবহারকারী অ্যাকাউন্টে গেমের জন্য প্লে লাইসেন্স নেই।

প্লে ব্যবহার করার বিষয়ে গাইডেন্স রক্ষ রায় রক্ষা করুন

আপনার অ্যাপ্লিকেশনটির ব্যাকএন্ড সার্ভারটি আপনার ঝুঁকি সহনশীলতার ভিত্তিতে রায়টির ভিত্তিতে কীভাবে কাজ করবেন তা সিদ্ধান্ত নিতে পারে। এখানে কিছু পরামর্শ এবং সম্ভাব্য ব্যবহারকারীর ক্রিয়া রয়েছে:

NO_ISSUES
প্লে প্রটেক্ট চালু আছে এবং কোনও সমস্যা খুঁজে পায়নি যাতে কোনও ব্যবহারকারীর পদক্ষেপের প্রয়োজন হয় না।
POSSIBLE_RISK এবং NO_DATA
এই রায়গুলি গ্রহণ করার সময়, ব্যবহারকারীকে সেই প্লে প্রটেক্টটি চালু আছে তা পরীক্ষা করতে বলুন এবং একটি স্ক্যান করেছেন। NO_DATA কেবল বিরল পরিস্থিতিতে উপস্থিত হওয়া উচিত।
MEDIUM_RISK এবং HIGH_RISK
আপনার ঝুঁকি সহনশীলতার উপর নির্ভর করে, আপনি ব্যবহারকারীকে প্লে প্রোটেকশন চালু করতে এবং সতর্কতা রক্ষা করুন প্লেটিতে পদক্ষেপ নিতে বলতে পারেন। যদি ব্যবহারকারী এই প্রয়োজনীয়তাগুলি ফুফিল করতে না পারে তবে আপনি তাদের সার্ভার অ্যাকশন থেকে অবরুদ্ধ করতে পারেন।
,

এই পৃষ্ঠাটি কীভাবে প্রত্যাবর্তিত সততা রায় দিয়ে ব্যাখ্যা এবং কাজ করবেন তা বর্ণনা করে। আপনি কোনও স্ট্যান্ডার্ড বা ক্লাসিক এপিআই অনুরোধ করুন না কেন, অখণ্ডতার রায়টি অনুরূপ সামগ্রীর সাথে একই ফর্ম্যাটে ফিরে আসে। অখণ্ডতা রায় ডিভাইস, অ্যাপ্লিকেশন এবং অ্যাকাউন্টগুলির বৈধতা সম্পর্কে তথ্য যোগাযোগ করে। আপনার অ্যাপের সার্ভারটি আপনার অ্যাপ্লিকেশনটিতে কোনও নির্দিষ্ট ক্রিয়া বা অনুরোধের সাথে কীভাবে এগিয়ে যেতে হবে তা নির্ধারণ করতে একটি ডিক্রিপ্ট করা, যাচাই করা রায়টিতে ফলাফলের পে -লোড ব্যবহার করতে পারে।

ফিরে আসা সততা রায় ফর্ম্যাট

পে-লোড প্লেইন-টেক্সট জেএসএন এবং বিকাশকারী সরবরাহিত তথ্যের পাশাপাশি অখণ্ডতা সংকেত রয়েছে।

সাধারণ পে -লোড কাঠামোটি নিম্নরূপ:

{
  requestDetails: { ... }
  appIntegrity: { ... }
  deviceIntegrity: { ... }
  accountDetails: { ... }
  environmentDetails: { ... }
}

আপনাকে প্রথমে পরীক্ষা করতে হবে যে requestDetails ফিল্ডের মানগুলি প্রতিটি অখণ্ডতা রায় পরীক্ষা করার আগে মূল অনুরোধের সাথে মেলে। নিম্নলিখিত বিভাগগুলি প্রতিটি ক্ষেত্রকে আরও বিশদে বর্ণনা করে।

অনুরোধ বিশদ ক্ষেত্র

requestDetails ফিল্ডে স্ট্যান্ডার্ড অনুরোধগুলির জন্য অনুরোধের বিকাশকারী-সরবরাহিত তথ্য এবং ক্লাসিক অনুরোধগুলির জন্য nonce requestHash সম্পর্কিত তথ্য রয়েছে।

স্ট্যান্ডার্ড এপিআই অনুরোধগুলির জন্য:

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 যাচাই করুন, নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন

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.
        ...
}

ক্লাসিক এপিআই অনুরোধগুলির জন্য:

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 যাচাই করুন, নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন

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
অ্যাপ্লিকেশন এবং শংসাপত্র গুগল প্লে দ্বারা বিতরণ করা সংস্করণগুলির সাথে মেলে।
UNRECOGNIZED_VERSION
শংসাপত্র বা প্যাকেজের নাম গুগল প্লে রেকর্ডের সাথে মেলে না।
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
অ্যাপ্লিকেশনটি গুগল প্লে পরিষেবাদি সহ একটি অ্যান্ড্রয়েড চালিত ডিভাইসে চলছে। ডিভাইসটি সিস্টেমের অখণ্ডতা চেক করে এবং অ্যান্ড্রয়েডের সামঞ্জস্যতার প্রয়োজনীয়তাগুলি পূরণ করে।
খালি (একটি ফাঁকা মান)
অ্যাপটি এমন একটি ডিভাইসে চলছে যা আক্রমণ করার লক্ষণ রয়েছে (যেমন এপিআই হুকিং) বা সিস্টেমের সমঝোতা (যেমন শিকড় হওয়া), বা অ্যাপ্লিকেশনটি কোনও শারীরিক ডিভাইসে চলছে না (যেমন একটি এমুলেটর যা গুগল প্লে ইন্টিগ্রিটি চেকগুলি পাস করে না)।

টোকেনটি একটি বিশ্বাসযোগ্য ডিভাইস থেকে এসেছে তা নিশ্চিত করার জন্য, নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে, যেমনটি প্রত্যাশা করা হয়েছে 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!
}

আপনার যদি আপনার টেস্টিং ডিভাইস মিটিং ডিভাইসের অখণ্ডতায় সমস্যা হয় তবে কারখানার রমটি ইনস্টল করা আছে তা নিশ্চিত করুন (উদাহরণস্বরূপ, ডিভাইসটি পুনরায় সেট করে) এবং বুটলোডারটি লক হয়ে গেছে। আপনি আপনার প্লে কনসোলে প্লে ইন্টিগ্রিটি এপিআই পরীক্ষাও তৈরি করতে পারেন।

শর্তাধীন ডিভাইস লেবেল

যদি আপনার অ্যাপ্লিকেশনটি পিসির জন্য গুগল প্লে গেমসে প্রকাশিত হয় তবে deviceRecognitionVerdict নিম্নলিখিত লেবেলও থাকতে পারে:

MEETS_VIRTUAL_INTEGRITY
অ্যাপটি গুগল প্লে পরিষেবাদি সহ একটি অ্যান্ড্রয়েড চালিত এমুলেটরটিতে চলছে। এমুলেটর সিস্টেমের অখণ্ডতা চেক করে এবং কোর অ্যান্ড্রয়েড সামঞ্জস্যতার প্রয়োজনীয়তাগুলি পূরণ করে।

Al চ্ছিক ডিভাইস তথ্য এবং ডিভাইস পুনরুদ্ধার

আপনি যদি অখণ্ডতার রায়টিতে অতিরিক্ত লেবেলগুলি গ্রহণ করতে বেছে নেন তবে deviceRecognitionVerdict নিম্নলিখিত অতিরিক্ত লেবেলগুলি থাকতে পারে:

MEETS_BASIC_INTEGRITY
অ্যাপ্লিকেশনটি এমন একটি ডিভাইসে চলছে যা বেসিক সিস্টেমের অখণ্ডতা চেকগুলি পাস করে এবং অ্যান্ড্রয়েড 13 বা তার পরে ডিভাইসের জন্য অ্যান্ড্রয়েড প্ল্যাটফর্ম কী সত্যতা প্রয়োজন। ডিভাইসটি অ্যান্ড্রয়েডের সামঞ্জস্যতার প্রয়োজনীয়তাগুলি পূরণ করতে পারে না এবং গুগল প্লে পরিষেবাগুলি চালানোর জন্য অনুমোদিত হতে পারে না। উদাহরণস্বরূপ, ডিভাইসটি অ্যান্ড্রয়েডের একটি অচেনা সংস্করণ চালানো হতে পারে, একটি আনলকড বুটলোডার থাকতে পারে, যাচাই করা বুট থাকতে পারে বা প্রস্তুতকারকের দ্বারা প্রত্যয়িত নাও হতে পারে।
MEETS_STRONG_INTEGRITY
অ্যাপ্লিকেশনটি গুগল প্লে পরিষেবাদি সহ একটি অ্যান্ড্রয়েড চালিত ডিভাইসে চলছে এবং বুটের অখণ্ডতার হার্ডওয়্যার-সমর্থিত প্রমাণ হিসাবে এবং অ্যান্ড্রয়েড 13 বা তার পরের ডিভাইসের জন্য সিস্টেম অখণ্ডতার একটি শক্তিশালী গ্যারান্টি রয়েছে এবং গত বছরে একটি সুরক্ষা আপডেট থাকতে হবে। ডিভাইসটি সিস্টেমের অখণ্ডতা চেক করে এবং অ্যান্ড্রয়েডের সামঞ্জস্যতার প্রয়োজনীয়তাগুলি পূরণ করে।

একটি একক ডিভাইস যদি লেবেলের প্রতিটি মানদণ্ড পূরণ করা হয় তবে ডিভাইস অখণ্ডতার রায়টিতে একাধিক ডিভাইস লেবেল ফেরত দেবে।

ডিভাইস বৈশিষ্ট্য

আপনি ডিভাইস বৈশিষ্ট্যগুলিতেও বেছে নিতে পারেন, যা ডিভাইসে চলমান অ্যান্ড্রয়েড ওএসের অ্যান্ড্রয়েড এসডিকে সংস্করণকে বলে। ভবিষ্যতে, এটি অন্যান্য ডিভাইসের বৈশিষ্ট্যগুলির সাথে প্রসারিত হতে পারে।

এসডিকে সংস্করণ মানটি হ'ল অ্যান্ড্রয়েড এসডিকে সংস্করণ নম্বরটি Build.VERSION_CODES সংজ্ঞায়িত। যদি কোনও প্রয়োজনীয় প্রয়োজনীয়তা মিস করা হয় তবে এসডিকে সংস্করণটি মূল্যায়ন করা হয় না। এই ক্ষেত্রে, sdkVersion ক্ষেত্রটি আনসেট করা হয়; সুতরাং, deviceAttributes ক্ষেত্রটি খালি। এটি ঘটতে পারে কারণ:

  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • ডিভাইসে প্রযুক্তিগত সমস্যা ছিল।

আপনি যদি deviceAttributes গ্রহণ করতে পছন্দ করেন তবে deviceIntegrity ফিল্ডটিতে নিম্নলিখিত অতিরিক্ত ক্ষেত্র থাকবে:

deviceIntegrity: {
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
  deviceAttributes: {
    // 33 is one possible value, which represents Android 13 (Tiramisu).
    sdkVersion: 33
  }
}

যদি এসডিকে সংস্করণটি মূল্যায়ন না করা হয়, তবে deviceAttributes ক্ষেত্রটি নিম্নলিখিত হিসাবে সেট করা হবে:

deviceIntegrity: {
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
  deviceAttributes: {}  // sdkVersion field is not set.
}

সাম্প্রতিক ডিভাইস ক্রিয়াকলাপ

আপনি সাম্প্রতিক ডিভাইস ক্রিয়াকলাপেও বেছে নিতে পারেন, যা আপনাকে জানায় যে আপনার অ্যাপ্লিকেশনটি শেষ মুহুর্তে একটি নির্দিষ্ট ডিভাইসে একটি অখণ্ডতা টোকেনের জন্য কতবার অনুরোধ করেছে। আপনি আপনার অ্যাপ্লিকেশনটিকে অপ্রত্যাশিত, হাইপারেক্টিভ ডিভাইসগুলির বিরুদ্ধে রক্ষা করতে সাম্প্রতিক ডিভাইস ক্রিয়াকলাপটি ব্যবহার করতে পারেন যা একটি সক্রিয় আক্রমণের ইঙ্গিত হতে পারে। আপনি সিদ্ধান্ত নিতে পারেন যে প্রতিটি সাম্প্রতিক ডিভাইস ক্রিয়াকলাপ স্তরের উপর নির্ভর করে আপনি প্রতি ঘন্টা একটি অখণ্ডতা টোকেনের জন্য অনুরোধ করার জন্য একটি সাধারণ ডিভাইসে ইনস্টল করা কতবার আশা করেন তার উপর ভিত্তি করে।

আপনি যদি recentDeviceActivity গ্রহণ করতে পছন্দ করেন তবে deviceIntegrity ক্ষেত্রের দুটি মান থাকবে:

deviceIntegrity: {
  deviceRecognitionVerdict: ["MEETS_DEVICE_INTEGRITY"]
  recentDeviceActivity: {
    // "LEVEL_2" is one of several possible values.
    deviceActivityLevel: "LEVEL_2"
  }
}

deviceActivityLevel সংজ্ঞাগুলি মোডগুলির মধ্যে পৃথক এবং নিম্নলিখিত মানগুলির মধ্যে একটি থাকতে পারে:

সাম্প্রতিক ডিভাইস ক্রিয়াকলাপ স্তর স্ট্যান্ডার্ড এপিআই ইন্টিগ্রিটি টোকেন এই ডিভাইসে প্রতি অ্যাপ্লিকেশনটিতে শেষ ঘন্টাটিতে অনুরোধ করে ক্লাসিক এপিআই ইন্টিগ্রিটি টোকেন এই ডিভাইসে প্রতি অ্যাপ্লিকেশনটিতে শেষ ঘন্টাটিতে অনুরোধ করে
LEVEL_1 (সর্বনিম্ন) 10 বা তার কম 5 বা তার কম
LEVEL_2 11 থেকে 25 এর মধ্যে 6 থেকে 10 এর মধ্যে
LEVEL_3 26 এবং 50 এর মধ্যে 11 থেকে 15 এর মধ্যে
LEVEL_4 (সর্বোচ্চ) 50 এর বেশি 15 এরও বেশি
UNEVALUATED সাম্প্রতিক ডিভাইস ক্রিয়াকলাপ মূল্যায়ন করা হয়নি। এটি ঘটতে পারে কারণ:
  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • ডিভাইসে ইনস্টল করা আপনার অ্যাপ্লিকেশনটির সংস্করণটি গুগল প্লে অজানা।
  • ডিভাইসে প্রযুক্তিগত সমস্যা।

ডিভাইস পুনরুদ্ধার (বিটা)

আপনি ডিভাইস রিক্যাল করতেও বেছে নিতে পারেন, যা আপনাকে নির্দিষ্ট ডিভাইসগুলির সাথে প্রতি-ডিভাইস ডেটা সংরক্ষণ করতে দেয় যা আপনার অ্যাপ্লিকেশনটি একই ডিভাইসে পরে আবার ইনস্টল করার সময় নির্ভরযোগ্যভাবে পুনরুদ্ধার করতে পারে। অখণ্ডতা টোকেনের জন্য অনুরোধ করার পরে, আপনি একটি নির্দিষ্ট ডিভাইসের জন্য ডিভাইস পুনরুদ্ধার মানগুলি সংশোধন করতে একটি পৃথক সার্ভার-টু-সার্ভার কল তৈরি করেন।

আপনি যদি deviceRecall পছন্দ করেন তবে deviceIntegrity ফিল্ডে আপনি নির্দিষ্ট ডিভাইসের জন্য সেট করা ডিভাইস পুনরুদ্ধার তথ্য ধারণ করবে:

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_DEVICE_INTEGRITY"],
  "deviceRecall": {
    "values": {
      "bitFirst": true,
      "bitSecond": false,
      "bitThird": true
    },
    "writeDates": {
      // Write time in YYYYMM format in UTC.
      "yyyymmFirst": 202401,
      // Note that yyyymmSecond is not set because bitSecond is false.
      "yyyymmThird": 202310
    }
  }
}

deviceRecall দুটি ক্ষেত্রে বিভক্ত:

  • values : আপনি আগে এই ডিভাইসের জন্য সেট করা বিট মানগুলি স্মরণ করুন।
  • writeDates : ইউটিসি -তে বিট রাইটিং তারিখগুলি স্মরণ করুন বছর এবং মাসের জন্য। রিক্যাল বিটের লেখার তারিখটি প্রতিবার বিটটি true হিসাবে সেট করা থাকাকালীন আপডেট করা হবে এবং বিটটি false সেট করা হলে সরানো হবে।

ক্ষেত্রে যখন ডিভাইস পুনরুদ্ধার তথ্য অনুপলব্ধ থাকে, তখন ডিভাইস পুনরুদ্ধার মান খালি থাকবে:

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_DEVICE_INTEGRITY"],
  "deviceRecall": {
    "values": {},
    "writeDates": {}
  }
}

অ্যাকাউন্টের বিশদ ক্ষেত্র

accountDetails ফিল্ডে একটি একক মান রয়েছে, appLicensingVerdict , যা ডিভাইসে সাইন ইন করা ব্যবহারকারী অ্যাকাউন্টের জন্য অ্যাপের গুগল প্লে লাইসেন্সিং স্থিতি উপস্থাপন করে। যদি ব্যবহারকারীর অ্যাকাউন্টে অ্যাপটির জন্য প্লে লাইসেন্স থাকে তবে এর অর্থ তারা এটি ডাউনলোড করেছে বা এটি গুগল প্লে থেকে কিনেছে।

accountDetails: {
  // This field can be LICENSED, UNLICENSED, or UNEVALUATED.
  appLicensingVerdict: "LICENSED"
}

appLicensingVerdict নিম্নলিখিত মানগুলির মধ্যে একটি থাকতে পারে:

LICENSED
ব্যবহারকারীর একটি অ্যাপ এনটাইটেলমেন্ট রয়েছে। অন্য কথায়, ব্যবহারকারী তাদের ডিভাইসে গুগল প্লে থেকে আপনার অ্যাপ্লিকেশনটি ইনস্টল বা আপডেট করেছেন।
UNLICENSED
ব্যবহারকারীর কোনও অ্যাপের এনটাইটেলমেন্ট নেই। উদাহরণস্বরূপ, যখন ব্যবহারকারী আপনার অ্যাপটি সাইডলড করে বা গুগল প্লে থেকে এটি অর্জন করে না তখন এটি ঘটে। আপনি এটির প্রতিকারের জন্য ব্যবহারকারীদের কাছে get_licensed ডায়ালগটি প্রদর্শন করতে পারেন।
UNEVALUATED

লাইসেন্সিংয়ের বিশদগুলি মূল্যায়ন করা হয়নি কারণ একটি প্রয়োজনীয় প্রয়োজনীয়তা মিস করা হয়েছিল।

এটি নিম্নলিখিতগুলি সহ বেশ কয়েকটি কারণে ঘটতে পারে:

  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • ডিভাইসে ইনস্টল করা আপনার অ্যাপ্লিকেশনটির সংস্করণটি গুগল প্লে অজানা।
  • ব্যবহারকারী গুগল প্লেতে সাইন ইন করা হয় না।

আপনার অ্যাপ্লিকেশনটির জন্য ব্যবহারকারীর একটি অ্যাপ্লিকেশন এনটাইটেলমেন্ট রয়েছে তা যাচাই করতে, যাচাই করুন যে 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!
}

পরিবেশের বিশদ ক্ষেত্র

আপনি পরিবেশ সম্পর্কে অতিরিক্ত সংকেতও বেছে নিতে পারেন। অ্যাপ্লিকেশন অ্যাক্সেস ঝুঁকি আপনার অ্যাপ্লিকেশনটিকে জানায় যে যদি এমন কোনও অ্যাপ্লিকেশন চলমান থাকে যা স্ক্রিনটি ক্যাপচার, ওভারলেগুলি প্রদর্শন করতে বা ডিভাইসটি নিয়ন্ত্রণ করতে ব্যবহৃত হতে পারে। প্লে প্রোটেক্ট রডিক্ট আপনাকে জানায় যে গুগল প্লে প্রোটেক্ট ডিভাইসে সক্ষম করা আছে এবং এটি ম্যালওয়্যারটি জানা গেছে কিনা।

আপনি যদি অ্যাপ অ্যাক্সেস রিস্ক রডিক্ট বা আপনার গুগল প্লে কনসোলে প্লে রক্ষার রায়টি বেছে নিয়েছেন তবে আপনার এপিআই প্রতিক্রিয়াতে environmentDetails ক্ষেত্র অন্তর্ভুক্ত থাকবে। environmentDetails ক্ষেত্রটিতে দুটি মান থাকতে পারে, appAccessRiskVerdict এবং playProtectVerdict

অ্যাপ্লিকেশন অ্যাক্সেস ঝুঁকি রায়

একবার সক্ষম হয়ে গেলে, প্লে ইন্টিগ্রিটি এপিআই পে -লোডে environmentDetails ফিল্ডে নতুন অ্যাপ অ্যাক্সেস ঝুঁকি রায় থাকবে।

{
  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 এক বা একাধিক প্রতিক্রিয়া সহ রয়েছে। এই প্রতিক্রিয়াগুলি সনাক্ত করা অ্যাপ্লিকেশনগুলির ইনস্টল উত্সের উপর নির্ভর করে নিম্নলিখিত দুটি গ্রুপের মধ্যে একটিতে পড়ে:

  • প্লে বা সিস্টেম অ্যাপস : অ্যাপ্লিকেশনগুলি যা গুগল প্লে দ্বারা ইনস্টল করা হয় বা ডিভাইসের সিস্টেম পার্টিশনে ডিভাইস প্রস্তুতকারকের দ্বারা প্রিললোড করা হয় ( FLAG_SYSTEM দিয়ে চিহ্নিত)। এই জাতীয় অ্যাপ্লিকেশনগুলির প্রতিক্রিয়াগুলি KNOWN_ দ্বারা উপসর্গযুক্ত।

  • অন্যান্য অ্যাপ্লিকেশন : অ্যাপ্লিকেশনগুলি যা গুগল প্লে দ্বারা ইনস্টল করা হয়নি। এটি ডিভাইস প্রস্তুতকারকের দ্বারা সিস্টেম পার্টিশনে প্রিলোড অ্যাপ্লিকেশনগুলি বাদ দেয়। এই জাতীয় অ্যাপ্লিকেশনগুলির প্রতিক্রিয়াগুলি UNKNOWN_ দ্বারা উপসর্গযুক্ত।

নিম্নলিখিত প্রতিক্রিয়াগুলি ফেরত দেওয়া যেতে পারে:

KNOWN_INSTALLED , UNKNOWN_INSTALLED
এমন অ্যাপস ইনস্টল রয়েছে যা সংশ্লিষ্ট ইনস্টল উত্সের সাথে মেলে।
KNOWN_CAPTURING , UNKNOWN_CAPTURING
এমন অ্যাপস চলছে যা আপনার অ্যাপ্লিকেশন চলাকালীন স্ক্রিনটি দেখতে ব্যবহার করা যেতে পারে এমন অনুমতিগুলি সক্ষম করে। এটি ডিভাইসে চলমান গুগল প্লে সম্পর্কে পরিচিত কোনও যাচাইযোগ্য অ্যাক্সেসিবিলিটি পরিষেবাগুলি বাদ দেয়।
KNOWN_CONTROLLING , UNKNOWN_CONTROLLING
এমন অ্যাপস চলছে যা অনুমতিগুলি সক্ষম করে যা ডিভাইসটি নিয়ন্ত্রণ করতে এবং সরাসরি আপনার অ্যাপ্লিকেশনটিতে ইনপুটগুলি নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে এবং আপনার অ্যাপ্লিকেশনটির ইনপুট এবং আউটপুট ক্যাপচার করতে ব্যবহার করা যেতে পারে। এটি ডিভাইসে চলমান গুগল প্লে সম্পর্কে পরিচিত কোনও যাচাইযোগ্য অ্যাক্সেসিবিলিটি পরিষেবাগুলি বাদ দেয়।
KNOWN_OVERLAYS , UNKNOWN_OVERLAYS
এমন অ্যাপস চলছে যা অনুমতিগুলি সক্ষম করে যা আপনার অ্যাপ্লিকেশনটিতে ওভারলেগুলি প্রদর্শন করতে ব্যবহার করা যেতে পারে। এটি ডিভাইসে চলমান গুগল প্লে সম্পর্কে পরিচিত কোনও যাচাইযোগ্য অ্যাক্সেসিবিলিটি পরিষেবাগুলি বাদ দেয়।
খালি (একটি ফাঁকা মান)

যদি কোনও প্রয়োজনীয় প্রয়োজনীয়তা মিস করা হয় তবে অ্যাপ অ্যাক্সেসের ঝুঁকিটি মূল্যায়ন করা হয় না। এক্ষেত্রে appAccessRiskVerdict ক্ষেত্রটি খালি। এটি নিম্নলিখিতগুলি সহ বেশ কয়েকটি কারণে ঘটতে পারে:

  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • ডিভাইস ফর্ম ফ্যাক্টর কোনও ফোন, ট্যাবলেট বা ভাঁজযোগ্য নয়।
  • ডিভাইসটি অ্যান্ড্রয়েড 6 (এপিআই স্তর 23) বা উচ্চতর চালাচ্ছে না।
  • ডিভাইসে ইনস্টল করা আপনার অ্যাপ্লিকেশনটির সংস্করণটি গুগল প্লে অজানা।
  • ডিভাইসে গুগল প্লে স্টোরের সংস্করণটি পুরানো।
  • কেবল গেমস : ব্যবহারকারী অ্যাকাউন্টে গেমের জন্য প্লে লাইসেন্স নেই।
  • verdictOptOut প্যারামিটারের সাথে একটি স্ট্যান্ডার্ড অনুরোধ ব্যবহৃত হয়েছিল।
  • একটি স্ট্যান্ডার্ড অনুরোধ একটি প্লে ইন্টিগ্রিটি এপিআই লাইব্রেরি সংস্করণ সহ ব্যবহৃত হয়েছিল যা এখনও স্ট্যান্ডার্ড অনুরোধগুলির জন্য অ্যাপ্লিকেশন অ্যাক্সেসের ঝুঁকি সমর্থন করে না।

অ্যাপ অ্যাক্সেস ঝুঁকি স্বয়ংক্রিয়ভাবে যাচাইযোগ্য অ্যাক্সেসিবিলিটি পরিষেবাগুলি বাদ দেয় যা বর্ধিত গুগল প্লে অ্যাক্সেসিবিলিটি পর্যালোচনার মাধ্যমে হয়েছে (ডিভাইসে কোনও অ্যাপ স্টোর দ্বারা ইনস্টল করা হয়েছে)। "বাদ দেওয়া" এর অর্থ হ'ল ডিভাইসে চলমান যাচাইযোগ্য অ্যাক্সেসিবিলিটি পরিষেবাগুলি অ্যাপ্লিকেশন অ্যাক্সেসের ঝুঁকি রায়টিতে ক্যাপচারিং, নিয়ন্ত্রণ বা ওভারলে প্রতিক্রিয়াগুলি ফেরত দেবে না। আপনার অ্যাক্সেসিবিলিটি অ্যাপের জন্য বর্ধিত গুগল প্লে অ্যাক্সেসিবিলিটি পর্যালোচনার জন্য অনুরোধ করতে, এটি আপনার অ্যাপ্লিকেশনটির ম্যানিফেস্টে isAccessibilityTool পতাকাটি সত্য হিসাবে সেট করা আছে তা নিশ্চিত করে গুগল প্লেতে এটি প্রকাশ করুন বা একটি পর্যালোচনার জন্য অনুরোধ করুন

নিম্নলিখিত টেবিলটি রায়গুলির কয়েকটি উদাহরণ দেয় এবং তাদের অর্থ কী (এই টেবিলটি প্রতিটি সম্ভাব্য ফলাফলের তালিকা করে না):

উদাহরণ অ্যাপ্লিকেশন অ্যাক্সেস ঝুঁকি রায় প্রতিক্রিয়া ব্যাখ্যা
appsDetected:
["KNOWN_INSTALLED"]
কেবলমাত্র এমন অ্যাপস ইনস্টল করা আছে যা গুগল প্লে দ্বারা স্বীকৃত বা ডিভাইস প্রস্তুতকারকের দ্বারা সিস্টেম পার্টিশনে প্রিললোড করা হয়েছে।
এমন কোনও অ্যাপ্লিকেশন চলমান নেই যার ফলস্বরূপ ক্যাপচারিং, নিয়ন্ত্রণ করা বা ওভারলেস রায় হবে।
appsDetected:
["KNOWN_INSTALLED",
"UNKNOWN_INSTALLED",
"UNKNOWN_CAPTURING"]
গুগল প্লে দ্বারা ইনস্টল করা অ্যাপ্লিকেশন রয়েছে বা ডিভাইস প্রস্তুতকারকের দ্বারা সিস্টেম পার্টিশনে প্রিলোড করা হয়েছে।
অন্যান্য অ্যাপ্লিকেশনগুলি চলছে এবং অনুমতি রয়েছে যা স্ক্রিনটি দেখতে বা অন্যান্য ইনপুট এবং আউটপুট ক্যাপচার করতে ব্যবহার করা যেতে পারে।
appsDetected:
["KNOWN_INSTALLED",
"KNOWN_CAPTURING",
"UNKNOWN_INSTALLED",
"UNKNOWN_CONTROLLING"]
এমন কিছু প্লে বা সিস্টেম চলছে যা অনুমতিগুলি সক্ষম করে যা স্ক্রিনটি দেখতে বা অন্যান্য ইনপুট এবং আউটপুট ক্যাপচার করতে ব্যবহৃত হতে পারে।
এছাড়াও অন্যান্য অ্যাপ্লিকেশনগুলি চলছে যা অনুমতিগুলি সক্ষম করে যা ডিভাইসটি নিয়ন্ত্রণ করতে এবং সরাসরি আপনার অ্যাপ্লিকেশনটিতে ইনপুটগুলি নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে।
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!
    }
}
প্রতিকার অ্যাপ্লিকেশন অ্যাক্সেস ঝুঁকি রায়

আপনার ঝুঁকির স্তরের উপর নির্ভর করে, আপনি ব্যবহারকারীকে কোনও অনুরোধ বা ক্রিয়া সম্পূর্ণ করার আগে আপনি কোন অ্যাপ অ্যাক্সেসের ঝুঁকিপূর্ণ রায়গুলি পদক্ষেপ নিতে চান তা সিদ্ধান্ত নিতে পারেন। Application চ্ছিক গুগল প্লে প্রম্পট রয়েছে যা অ্যাপ্লিকেশন অ্যাক্সেসের ঝুঁকি রায়টি পরীক্ষা করার পরে আপনি ব্যবহারকারীকে দেখাতে পারেন। আপনি ক্লোজ_অননাউন_অ্যাকসেস_রিস্ককে ব্যবহারকারীকে অ্যাপ্লিকেশন অ্যাক্সেসের ঝুঁকি রায় কারণ হিসাবে অজানা অ্যাপ্লিকেশনগুলি বন্ধ করতে বলার জন্য জিজ্ঞাসা করতে পারেন বা আপনি ক্লোজ_এএল_অ্যাকসেস_রিস্ককে ব্যবহারকারীকে সমস্ত অ্যাপ্লিকেশনগুলি (পরিচিত এবং অজানা) বন্ধ করতে জিজ্ঞাসা করতে পারেন যাতে অ্যাপ্লিকেশন অ্যাক্সেসের ঝুঁকির রায় ঘটায়।

সুরক্ষা রায় রক্ষা করুন

একবার সক্ষম হয়ে গেলে, প্লে ইন্টিগ্রিটি এপিআই পে -লোডে environmentDetails ফিল্ডে প্লে সুরক্ষার রায়টি থাকবে:

environmentDetails: {
  playProtectVerdict: "NO_ISSUES"
}

playProtectVerdict নিম্নলিখিত মানগুলির মধ্যে একটি থাকতে পারে:

NO_ISSUES
প্লে প্রোটেকশন চালু করা হয় এবং ডিভাইসে কোনও অ্যাপ্লিকেশন সমস্যা খুঁজে পায়নি।
NO_DATA
প্লে প্রোটেক্ট চালু আছে তবে এখনও কোনও স্ক্যান করা হয়নি। ডিভাইস বা প্লে স্টোর অ্যাপটি সম্প্রতি পুনরায় সেট করা হতে পারে।
POSSIBLE_RISK
প্লে প্রোটেকশন বন্ধ করা হয়।
MEDIUM_RISK
প্লে প্রোটেকশন চালু করা হয় এবং ডিভাইসে সম্ভাব্য ক্ষতিকারক অ্যাপ্লিকেশনগুলি ইনস্টল করা হয়েছে।
HIGH_RISK
প্লে প্রোটেকশন চালু করা হয় এবং ডিভাইসে বিপজ্জনক অ্যাপ্লিকেশনগুলি ইনস্টল করা হয়েছে।
UNEVALUATED

নাটক সুরক্ষার রায়টি মূল্যায়ন করা হয়নি।

এটি নিম্নলিখিতগুলি সহ বেশ কয়েকটি কারণে ঘটতে পারে:

  • ডিভাইসটি যথেষ্ট বিশ্বাসযোগ্য নয়।
  • কেবল গেমস : ব্যবহারকারী অ্যাকাউন্টে গেমের জন্য প্লে লাইসেন্স নেই।

প্লে ব্যবহার করার বিষয়ে গাইডেন্স রক্ষ রায় রক্ষা করুন

আপনার অ্যাপ্লিকেশনটির ব্যাকএন্ড সার্ভারটি আপনার ঝুঁকি সহনশীলতার ভিত্তিতে রায়টির ভিত্তিতে কীভাবে কাজ করবেন তা সিদ্ধান্ত নিতে পারে। এখানে কিছু পরামর্শ এবং সম্ভাব্য ব্যবহারকারীর ক্রিয়া রয়েছে:

NO_ISSUES
প্লে প্রটেক্ট চালু আছে এবং কোনও সমস্যা খুঁজে পায়নি যাতে কোনও ব্যবহারকারীর পদক্ষেপের প্রয়োজন হয় না।
POSSIBLE_RISK এবং NO_DATA
এই রায়গুলি গ্রহণ করার সময়, ব্যবহারকারীকে সেই প্লে প্রটেক্টটি চালু আছে তা পরীক্ষা করতে বলুন এবং একটি স্ক্যান করেছেন। NO_DATA কেবল বিরল পরিস্থিতিতে উপস্থিত হওয়া উচিত।
MEDIUM_RISK এবং HIGH_RISK
আপনার ঝুঁকি সহনশীলতার উপর নির্ভর করে, আপনি ব্যবহারকারীকে প্লে প্রোটেকশন চালু করতে এবং সতর্কতা রক্ষা করুন প্লেটিতে পদক্ষেপ নিতে বলতে পারেন। যদি ব্যবহারকারী এই প্রয়োজনীয়তাগুলি ফুফিল করতে না পারে তবে আপনি তাদের সার্ভার অ্যাকশন থেকে অবরুদ্ধ করতে পারেন।