আপনার অ্যাপে PC-এর জন্য Play Integrity ইন্টিগ্রেট করুন

পিসির জন্য প্লে ইন্টিগ্রিটি আপনাকে পরীক্ষা করতে সাহায্য করে যে গেম ইভেন্ট এবং সার্ভারের অনুরোধগুলি একটি আসল পিসি ডিভাইসে গুগল প্লে গেমস ফর পিসির আসল উদাহরণ থেকে আসছে। সম্ভাব্য ঝুঁকিপূর্ণ ডিভাইস এবং অজানা এমুলেটর সনাক্ত করে, আপনার গেমের ব্যাকএন্ড সার্ভার প্রতারণা, অননুমোদিত অ্যাক্সেস, প্রতারণামূলক ট্র্যাফিক এবং অপব্যবহার প্রতিরোধ করার জন্য যথাযথ পদক্ষেপ নিতে পারে।

পূর্বশর্ত

ধাপ ১: আপনার গেমে পিসির জন্য প্লে ইন্টিগ্রিটি কীভাবে ব্যবহার করবেন তা নির্ধারণ করুন।

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

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

ধাপ ২: আপনার গেমে ইন্টিগ্রিটি টোকেনের অনুরোধ করুন

পিসির জন্য ওয়ার্ম আপ প্লে ইন্টিগ্রিটি

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

void PrepareIntegrityToken(
  const PrepareIntegrityTokenParams & params,
  PrepareIntegrityTokenContinuation continuation
)

সফল হলে, ধারাবাহিকতাটি একটি PrepareIntegrityTokenResultValue দিয়ে ডাকা হবে যার মধ্যে একটি RequestTokenData থাকবে যা একটি ইন্টিগ্রিটি টোকেন অনুরোধ করতে ব্যবহার করা উচিত। এই ডেটা মেমোরিতে ক্যাশে করা উচিত এবং RequestIntegrityToken এ কল করার জন্য অ্যাপ্লিকেশনের সেশনের সময়কালের জন্য পুনরায় ব্যবহার করা উচিত।

আপনার আবেদন যদি নির্ধারণ করে যে সততার রায় সম্পূর্ণরূপে পুনর্মূল্যায়ন করা প্রয়োজন, তবেই কেবল PrepareIntegrityToken- এ কল করা উচিত।

বিস্তারিত
পরামিতি params : একটি গুগল ক্লাউড প্রকল্প নম্বর ধারণকারী প্যারামিটার।
continuation : ইন্টিগ্রিটি টোকেন প্রদানকারীকে ফেরত পাঠানোর জন্য অ্যাসিঙ্ক কলব্যাক।

PrepareIntegrityToken অ্যাকশনটি কীভাবে কল করা উচিত তা দেখানো একটি কোড স্নিপেট নিম্নরূপ প্রদান করা হয়েছে:

google::play::integrity::IntegrityClient client_;

google::play::integrity::PrepareIntegrityTokenResult
IntegrityInterface::PrepareIntegrityToken(int64_t cloud_project_number) {
  google::play::integrity::PrepareIntegrityTokenParams params;
  params.cloud_project_number = cloud_project_number;

  auto promise = std::make_shared<
      std::promise<google::play::integrity::PrepareIntegrityTokenResult>>();
  client_.PrepareIntegrityToken(
      params,
      [promise](
          google::play::integrity::PrepareIntegrityTokenResult result) {
        promise->set_value(std::move(result));
      });

  return promise->get_future().get();
}

একটি অখণ্ডতা টোকেনের অনুরোধ করুন

ইন্টিগ্রিটি টোকেন হল এমন একটি প্রক্রিয়া যার মাধ্যমে আপনার গেমটি ডিভাইসটি নষ্ট হয়েছে কিনা তা যাচাই করা যায়। যখনই আপনার গেমটি সার্ভারের অনুরোধ করে এবং আপনি যাচাই করতে চান যে এটি আসল কিনা, আপনি একটি ইন্টিগ্রিটি টোকেনের অনুরোধ করতে পারেন এবং তারপর ডিক্রিপশন এবং যাচাইয়ের জন্য এটি আপনার গেমের ব্যাকএন্ড সার্ভারে পাঠাতে পারেন।

যখন আপনি আপনার অ্যাপে Play Integrity API for PC ব্যবহার করে কোনও ব্যবহারকারীর অ্যাকশন পরীক্ষা করছেন, তখন আপনি ট্যাম্পারিং আক্রমণ কমাতে RequestIntegrityTokenParams::request_hash ফিল্ড ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি আপনার গেমের ব্যাকএন্ড সার্ভারে প্লেয়ারের স্কোর রিপোর্ট করতে চাইতে পারেন, এবং আপনার সার্ভার যাচাই করতে চাইবে যে এই স্কোরটি কোনও প্রক্সি সার্ভার দ্বারা টেম্পার করা হয়নি। Play Integrity for PC এই ফিল্ডে আপনার সেট করা মানটি স্বাক্ষরিত ইন্টিগ্রিটি রেসপন্সের ভিতরে ফেরত দিতে পারে। requestHash ছাড়া, ইন্টিগ্রিটি টোকেনটি কেবল ডিভাইসের সাথে আবদ্ধ থাকবে, তবে নির্দিষ্ট অনুরোধের সাথে নয়, যা আক্রমণের সম্ভাবনা উন্মুক্ত করে।

void RequestIntegrityToken(
  const RequestIntegrityTokenParams & params,
  RequestIntegrityTokenContinuation continuation
)

যখন আপনি একটি সততা রায়ের অনুরোধ করেন, তখন আক্রমণের সম্ভাবনা কমাতে:

  • ব্যবহারকারীর অ্যাকশন বা সার্ভার রিকোয়েস্ট থেকে সমস্ত প্রাসঙ্গিক রিকোয়েস্ট প্যারামিটারের (যেমন একটি স্থিতিশীল রিকোয়েস্ট সিরিয়ালাইজেশনের SHA256) একটি ডাইজেস্ট গণনা করুন।
  • RequestIntegrityTokenParams::request_hash ক্ষেত্রটি ডাইজেস্টে সেট করুন।
বিস্তারিত
পরামিতি params : প্রস্তুতকৃত RequestTokenData এবং ইন্টিগ্রিটি চেক রিকোয়েস্ট হ্যাশ ধারণকারী প্যারামিটার।
continuation : ডেটা ফেরত দেওয়ার জন্য অ্যাসিঙ্ক কলব্যাক।

RequestIntegrityToken অ্যাকশনটি কীভাবে কল করা যেতে পারে তা দেখানো একটি কোড স্নিপেট নিম্নরূপ প্রদান করা হয়েছে:

absl::StatusOr<google::play::integrity::RequestIntegrityTokenResult>
IntegrityInterface::RequestIntegrityToken(
    const google::play::integrity::PrepareIntegrityTokenResult&
        prepare_integrity_token_result,
    const std::string& request_hash) {
  // Check if the prepare_integrity_token_result is OK
  if (!prepare_integrity_token_result.ok()) {
    return absl::FailedPreconditionError(
        absl::StrCat("PrepareIntegrityTokenResult is not OK. Error code: ",
                     prepare_integrity_token_result.error_code));
  }

  google::play::integrity::RequestIntegrityTokenParams params{
      .request_token_data =
          prepare_integrity_token_result.request_token_data,
      .request_hash = request_hash};

  auto promise = std::make_shared<std::promise<
      google::play::integrity::RequestIntegrityTokenResult>>();
  client_.RequestIntegrityToken(
      params,
      [promise](google::play::integrity::RequestIntegrityTokenResult result) {
        promise->set_value(std::move(result));
      });

  return promise->get_future().get();
}

ধাপ ৩: আপনার গেমের ব্যাকএন্ড সার্ভারে ইন্টিগ্রিটি টোকেনগুলি ডিক্রিপ্ট করুন এবং যাচাই করুন।

একটি ইন্টিগ্রিটি টোকেন ডিক্রিপ্ট করুন

আপনি একটি ইন্টিগ্রিটি রায়ের অনুরোধ করার পরে, Play Integrity API একটি এনক্রিপ্ট করা রেসপন্স টোকেন প্রদান করে। ডিভাইস ইন্টিগ্রিটি রায় পেতে, আপনাকে Google এর সার্ভারে ইন্টিগ্রিটি টোকেনটি ডিক্রিপ্ট করতে হবে:

  1. গুগল ক্লাউড প্রজেক্টের মধ্যে একটি পরিষেবা অ্যাকাউন্ট তৈরি করুন যা আপনার অ্যাপের সাথে লিঙ্ক করা আছে।
  2. আপনার অ্যাপের সার্ভারে, playintegrity স্কোপ ব্যবহার করে আপনার পরিষেবা অ্যাকাউন্টের শংসাপত্র থেকে অ্যাক্সেস টোকেনটি আনুন এবং নিম্নলিখিত অনুরোধটি করুন:

    playintegrity.googleapis.com/v1/<var>PACKAGE_NAME</var>:decodePcIntegrityToken -d \
     '{ "integrity_token": "<var>INTEGRITY_TOKEN</var>" }'
    
  3. JSON প্রতিক্রিয়াটি পড়ুন।

ফলস্বরূপ পেলোডটি একটি প্লেইন-টেক্সট টোকেন যা ডেভেলপার-প্রদত্ত তথ্যের সাথে ইন্টিগ্রিটি রায় এবং বিশদ বিবরণ ধারণ করে। একটি ডিক্রিপ্টেড ইন্টিগ্রিটি টোকেন দেখতে নিম্নরূপ:

{
  "requestDetails": {
    "requestPackageName": "com.your.package.name",
    "requestTime": "2025-08-29T13:10:37.285Z",
    "requestHash": "your_request_hash_string"
  },
  "deviceIntegrity": {
    "deviceRecognitionVerdict": [
      "MEETS_PC_INTEGRITY"
    ]
  },
  "accountDetails": {
    "appLicensingVerdict": "LICENSED"
  }
}

অখণ্ডতা টোকেন যাচাই করুন

ডিকোড করা ইন্টিগ্রিটি টোকেনের requestDetails ফিল্ডে অনুরোধ সম্পর্কে তথ্য থাকে, যার মধ্যে requestHash এ ডেভেলপার-প্রদত্ত তথ্যও থাকে।

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

const auto& request_details = json_payload["requestDetails"];

if (request_details.value("requestPackageName", "") != <YOUR_PACKAGE_NAME>) {
  // Don't trust the verdicts.
}

// Check for the existence of the request_hash.
// If you set a request hash in the request and it's not present, you shouldn't
// trust the verdicts.
if (!request_details.contains("requestHash")) {
    // Don't trust the verdicts.
}


// The requestHash from request_details needs to match the request hash your
// app provided.
if (request_details.value("requestHash", "") != <PROVIDED_REQUEST_HASH>) {
    // Don't trust the verdicts.
}

// You can read the rest of payload's fields.

ধাপ ৪: সততার রায়ের ভিত্তিতে কী পদক্ষেপ নেওয়া হবে তা নির্ধারণ করুন

deviceIntegrity ফিল্ডে একটি একক মান থাকতে পারে, deviceRecognitionVerdict । আপনার গেমটি এমন একটি পিসিতে চলছে কিনা তা নির্ধারণ করতে আপনি এই মানটি ব্যবহার করতে পারেন যা Play ইন্টিগ্রিটি চেক পাস করে (যা একটি MEETS_PC_INTEGRITY প্রতিক্রিয়া)। accountDetails ফিল্ডে একটি একক মান রয়েছে, appLicensingVerdict । ব্যবহারকারী Play থেকে লাইসেন্স পেয়েছেন কিনা তা নির্ধারণ করতে আপনি এই মানটি ব্যবহার করতে পারেন। আপনার গেমের ব্যাকএন্ড সার্ভার এই তথ্য সংগ্রহ করতে পারে এবং আপনার গেমটি কী পদক্ষেপ নেবে তা নির্ধারণ করতে এটি ব্যবহার করতে পারে, যেমন একটি গেম ইভেন্টকে এগিয়ে যাওয়ার অনুমতি দেওয়া বা ঝুঁকিপূর্ণ ট্র্যাফিকের অ্যাক্সেস অস্বীকার করা।

"deviceIntegrity": {
  "deviceRecognitionVerdict": ["MEETS_PC_INTEGRITY"]
}
"accountDetails": {
  "appLicensingVerdict": "LICENSED"
}

ডিভাইসের অখণ্ডতার রায়

deviceRecognitionVerdict নিম্নলিখিত মান থাকতে পারে:

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

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

appLicensingVerdict নিম্নলিখিত মান থাকতে পারে:

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

ধাপ ৫: ত্রুটি কোডগুলি পরিচালনা করুন

যদি আপনার গেমটি পিসির জন্য Play Integrity অনুরোধ করে এবং কলটি ব্যর্থ হয়, তাহলে আপনার গেমটি একটি ত্রুটি কোড পাবে। এই ত্রুটিগুলি বিভিন্ন কারণে ঘটতে পারে, যেমন পরিবেশগত সমস্যা যেমন দুর্বল নেটওয়ার্ক সংযোগ, আপনার API ইন্টিগ্রেশনের সমস্যা, অথবা দূষিত কার্যকলাপ এবং সক্রিয় আক্রমণ।

পুনঃচেষ্টাযোগ্য ত্রুটি কোডগুলি

এই ত্রুটিগুলির কারণ কখনও কখনও ক্ষণস্থায়ী অবস্থার কারণে হয়, এবং তাই আপনার একটি সূচকীয় ব্যাক-অফ কৌশল ব্যবহার করে কলটি পুনরায় চেষ্টা করা উচিত।

ইন্টিগ্রিটি ত্রুটি ত্রুটির বর্ণনা ত্রুটি কোড
kNetworkError ডিভাইসে নেটওয়ার্ক সংযোগের সমস্যা।
kTooManyRequests ডিভাইসটি থেকে অনেক বেশি অনুরোধ করা হয়েছে।
kClientTransientError ক্লায়েন্টের সাথে একটি ক্ষণস্থায়ী সমস্যা।

পুনঃচেষ্টা কৌশল সম্পর্কে আরও সুপারিশের জন্য এখানে দেখুন।

পুনরায় চেষ্টা করা যায় না এমন ত্রুটি কোড

এই ক্ষেত্রে স্বয়ংক্রিয় পুনঃচেষ্টা সাহায্য করার সম্ভাবনা কম। তবে, ব্যবহারকারী যদি সমস্যার কারণ হিসেবে চিহ্নিত সমস্যাটি সমাধান করেন তবে ম্যানুয়াল পুনঃচেষ্টা সাহায্য করতে পারে।

ইন্টিগ্রিটি ত্রুটি ত্রুটির বর্ণনা ত্রুটি কোড প্রস্তাবিত পদক্ষেপ
kError SDK অ্যাকশনের সময় মারাত্মক ত্রুটি। পুনরায় চেষ্টা করার আগে আপনার API বাস্তবায়ন যাচাই করুন।
kCloudProjectNumberIsInvalid ক্লাউড প্রজেক্ট নম্বরটি অবৈধ। আপনার ক্লাউড প্রজেক্ট নম্বরটি গুগল ক্লাউড কনসোলে সঠিকভাবে কনফিগার করা আছে কিনা এবং অনুরোধগুলি সঠিক ক্লাউড প্রজেক্ট নম্বর দিয়ে করা হয়েছে কিনা তা যাচাই করুন।
kRequestHashTooLong অনুরোধ হ্যাশটি অনেক লম্বা। তৈরি করা অনুরোধ হ্যাশগুলি খুব দীর্ঘ। নিশ্চিত করুন যে সেগুলি ৫০০ অক্ষরের কম।
kNoValidPreparedTokenFound টোকেন অনুরোধ করার আগে কোনও প্রস্তুত টোকেন নেই। [RequestIntegrityToken][request-integrity-token] কল করার আগে [PrepareIntegrityToken][prepare-token] অ্যাকশনটি কল করুন।
kSdkRuntimeUpdateRequired Play for Native SDK-এর জন্য একটি আপডেট প্রয়োজন। নিশ্চিত করুন যে ডিভাইসে থাকা Google Play পরিষেবা ক্লায়েন্টটি আপ টু ডেট আছে এবং আপনি Play for Native PC SDK-এর সর্বশেষ সংস্করণ ব্যবহার করছেন।

আপনার অ্যাপের মধ্যে বিভিন্ন Play Integrity API প্রতিক্রিয়া পরীক্ষা করুন

Play Integrity API আপনার অ্যাপের সাথে কীভাবে ইন্টারঅ্যাক্ট করে তা মূল্যায়ন করার জন্য আপনি পরীক্ষা তৈরি করতে পারেন।

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

  2. এখানে একটি টিকিট তৈরি করুন এবং কোন Google গ্রুপ কোন API প্রতিক্রিয়া পাবে তা রিপোর্ট করুন। প্রতিটি গ্রুপকে নিম্নলিখিত পছন্দগুলির মধ্যে একটি গ্রহণ করার জন্য নির্ধারিত করা হয়েছে:

    লাইসেন্সিং রায় পাস করুন লাইসেন্সিং ব্যর্থতার রায় লাইসেন্সিং রায় মূল্যায়ন করতে অক্ষম
    ডিভাইসের অখণ্ডতা পাস করুন ALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_LICENSED ALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_UNLICENSED ALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_LICENSING_UNEVALUATED
    ডিভাইসের অখণ্ডতা ব্যর্থ হয়েছে নিষিদ্ধ নিষিদ্ধ ALLOWLIST_CONFIG_NO_PC_INTEGRITY_LICENSING_UNEVALUATED
    যদি আপনি ডিভাইসের অখণ্ডতা রায়ে ব্যর্থ হন, তাহলে লাইসেন্সিং রায় সর্বদা অমূল্যায়িত ফিরে আসবে।

  3. অনুরোধটি প্রক্রিয়া করা হয়ে গেলে এবং পরীক্ষামূলক ব্যবহারকারীরা পরীক্ষার জন্য পূর্বনির্ধারিত অখণ্ডতা রায় পাওয়ার জন্য অনুমোদিত তালিকায় থাকলে আপনাকে অবহিত করা হবে।