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

Play Integrity for PC আপনাকে চেক করতে সাহায্য করে যে গেমের ইভেন্ট এবং সার্ভারের অনুরোধগুলি আসল পিসি ডিভাইসে PC-এর জন্য Google Play Games-এর প্রকৃত উদাহরণ থেকে আসছে। সম্ভাব্য ঝুঁকিপূর্ণ ডিভাইস এবং অজানা এমুলেটর সনাক্ত করে, আপনার গেমের ব্যাকএন্ড সার্ভার প্রতারণা, অননুমোদিত অ্যাক্সেস, প্রতারণামূলক ট্র্যাফিক এবং অপব্যবহার রোধ করতে যথাযথ পদক্ষেপের সাথে প্রতিক্রিয়া জানাতে পারে।

প্রাক-প্রয়োজনীয়

ধাপ 1: আপনি কিভাবে আপনার গেমে PC এর জন্য Play Integrity ব্যবহার করবেন তা নির্ধারণ করুন

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

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

ধাপ 2: আপনার গেমে অখণ্ডতা টোকেন অনুরোধ করুন

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

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

void PrepareIntegrityToken(
  const PrepareIntegrityTokenParams & params,
  PrepareIntegrityTokenContinuation continuation
)

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

শুধুমাত্র যদি আপনার আবেদন নির্ধারণ করে যে অখণ্ডতার রায় সম্পূর্ণরূপে পুনঃমূল্যায়ন করা প্রয়োজন PrepareIntegrityToken- এ একটি কল করা উচিত।

বিস্তারিত
পরামিতি params : একটি Google ক্লাউড প্রকল্প নম্বর ধারণকারী পরামিতি।
continuation : অখণ্ডতা টোকেন প্রদানকারীকে ফেরত দিতে async কলব্যাক।

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();
}

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

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

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

void RequestIntegrityToken(
  const RequestIntegrityTokenParams & params,
  RequestIntegrityTokenContinuation continuation
)

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

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

কিভাবে 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();
}

ধাপ 3: পরবর্তীতে আপনার গেমের ব্যাকএন্ড সার্ভারে অখণ্ডতা টোকেনগুলি ডিক্রিপ্ট করুন এবং যাচাই করুন

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

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

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

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

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.

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

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

"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-এ সাইন ইন করেননি।

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

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

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

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

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

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

অ-পুনরায় চেষ্টাযোগ্য ত্রুটি কোড

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

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

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

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

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

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

    লাইসেন্সিং রায় পাস ব্যর্থ লাইসেন্সিং রায় লাইসেন্সিং রায় মূল্যায়ন করতে অক্ষম
    ডিভাইস অখণ্ডতা পাস ALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_LICENSED ALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_UNLICENSED ALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_LICENSING_UNEVALUATED
    ডিভাইস অখণ্ডতা ব্যর্থ N/A N/A ALLOWLIST_CONFIG_NO_PC_INTEGRITY_LICENSING_UNEVALUATED
    আপনি ডিভাইসের অখণ্ডতার রায় ব্যর্থ হলে, লাইসেন্সিং রায় সর্বদা অমূল্যায়িত হবে৷

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