একটি আদর্শ API অনুরোধ করুন

এই পৃষ্ঠাটি অখণ্ডতার রায়ের জন্য স্ট্যান্ডার্ড API অনুরোধ করার বর্ণনা দেয়, যা Android 5.0 (API স্তর 21) বা উচ্চতর সংস্করণে সমর্থিত। ইন্টারঅ্যাকশনটি সত্যি কিনা তা পরীক্ষা করার জন্য যখনই আপনার অ্যাপ সার্ভার কল করছে তখন আপনি একটি অখণ্ডতার রায়ের জন্য একটি আদর্শ API অনুরোধ করতে পারেন।

ওভারভিউ

সিকোয়েন্স ডায়াগ্রাম যা প্লে ইন্টিগ্রিটি API-এর উচ্চ-স্তরের নকশা দেখায়

একটি আদর্শ অনুরোধ দুটি অংশ নিয়ে গঠিত:

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

অখণ্ডতা টোকেন প্রদানকারী প্রস্তুত করুন (একটি বন্ধ):

  1. আপনার অ্যাপটি আপনার Google ক্লাউড প্রজেক্ট নম্বর দিয়ে ইন্টিগ্রিটি টোকেন প্রদানকারীকে কল করে।
  2. আপনার অ্যাপটি আরও সত্যায়িত চেক কলের জন্য মেমরিতে অখণ্ডতা টোকেন প্রদানকারীকে ধরে রাখে।

একটি অখণ্ডতা টোকেন অনুরোধ করুন (চাহিদা অনুযায়ী):

  1. ব্যবহারকারীর যে ক্রিয়াটি সুরক্ষিত করা দরকার তার জন্য, আপনার অ্যাপটি হ্যাশ গণনা করে (যেকোন উপযুক্ত হ্যাশ অ্যালগরিদম যেমন SHA256 ব্যবহার করে) অনুরোধ করা হবে৷
  2. আপনার অ্যাপ অনুরোধ হ্যাশ পাস করে একটি অখণ্ডতা টোকেন অনুরোধ করে।
  3. আপনার অ্যাপটি Play Integrity API থেকে স্বাক্ষরিত এবং এনক্রিপ্ট করা ইন্টিগ্রিটি টোকেন পায়।
  4. আপনার অ্যাপটি আপনার অ্যাপের ব্যাকএন্ডে অখণ্ডতা টোকেন পাস করে।
  5. আপনার অ্যাপের ব্যাকএন্ড একটি Google Play সার্ভারে টোকেন পাঠায়। Google Play সার্ভার ডিক্রিপ্ট করে এবং রায় যাচাই করে, ফলাফলগুলি আপনার অ্যাপের ব্যাকএন্ডে ফিরিয়ে দেয়।
  6. টোকেন পেলোডে থাকা সংকেতের উপর ভিত্তি করে আপনার অ্যাপের ব্যাকএন্ড কীভাবে এগিয়ে যেতে হবে তা নির্ধারণ করে।
  7. আপনার অ্যাপের ব্যাকএন্ড সিদ্ধান্তের ফলাফল আপনার অ্যাপে পাঠায়।

অখণ্ডতা টোকেন প্রদানকারী প্রস্তুত করুন (এক বন্ধ)

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

আপনি সততা টোকেন প্রদানকারী প্রস্তুত করতে পারেন:

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

অখণ্ডতা টোকেন প্রদানকারী প্রস্তুত করতে নিম্নলিখিতগুলি করুন:

  1. নিম্নলিখিত উদাহরণে দেখানো হিসাবে একটি StandardIntegrityManager তৈরি করুন।
  2. setCloudProjectNumber() পদ্ধতির মাধ্যমে Google ক্লাউড প্রকল্প নম্বর সরবরাহ করে একটি PrepareIntegrityTokenRequest তৈরি করুন।
  3. PrepareIntegrityTokenRequest সাপ্লাই করে, prepareIntegrityToken() কল করতে ম্যানেজার ব্যবহার করুন।

জাভা

import com.google.android.gms.tasks.Task;

// Create an instance of a manager.
StandardIntegrityManager standardIntegrityManager =
    IntegrityManagerFactory.createStandard(applicationContext);

StandardIntegrityTokenProvider integrityTokenProvider;
long cloudProjectNumber = ...;

// Prepare integrity token. Can be called once in a while to keep internal
// state fresh.
standardIntegrityManager.prepareIntegrityToken(
    PrepareIntegrityTokenRequest.builder()
        .setCloudProjectNumber(cloudProjectNumber)
        .build())
    .addOnSuccessListener(tokenProvider -> {
        integrityTokenProvider = tokenProvider;
    })
    .addOnFailureListener(exception -> handleError(exception));

ঐক্য

IEnumerator PrepareIntegrityTokenCoroutine() {
    long cloudProjectNumber = ...;

    // Create an instance of a standard integrity manager.
    var standardIntegrityManager = new StandardIntegrityManager();

    // Request the token provider.
    var integrityTokenProviderOperation =
      standardIntegrityManager.PrepareIntegrityToken(
        new PrepareIntegrityTokenRequest(cloudProjectNumber));

    // Wait for PlayAsyncOperation to complete.
    yield return integrityTokenProviderOperation;

    // Check the resulting error code.
    if (integrityTokenProviderOperation.Error != StandardIntegrityErrorCode.NoError)
    {
        AppendStatusLog("StandardIntegrityAsyncOperation failed with error: " +
                integrityTokenProviderOperation.Error);
        yield break;
    }

    // Get the response.
    var integrityTokenProvider = integrityTokenProviderOperation.GetResult();
}

স্থানীয়

/// Initialize StandardIntegrityManager
StandardIntegrityManager_init(/* app's java vm */, /* an android context */);
/// Create a PrepareIntegrityTokenRequest opaque object.
int64_t cloudProjectNumber = ...;
PrepareIntegrityTokenRequest* tokenProviderRequest;
PrepareIntegrityTokenRequest_create(&tokenProviderRequest);
PrepareIntegrityTokenRequest_setCloudProjectNumber(tokenProviderRequest, cloudProjectNumber);

/// Prepare a StandardIntegrityTokenProvider opaque type pointer and call
/// StandardIntegrityManager_prepareIntegrityToken().
StandardIntegrityTokenProvider* tokenProvider;
StandardIntegrityErrorCode error_code =
        StandardIntegrityManager_prepareIntegrityToken(tokenProviderRequest, &tokenProvider);

/// ...
/// Proceed to polling iff error_code == STANDARD_INTEGRITY_NO_ERROR
if (error_code != STANDARD_INTEGRITY_NO_ERROR)
{
    /// Remember to call the *_destroy() functions.
    return;
}
/// ...
/// Use polling to wait for the async operation to complete.

IntegrityResponseStatus token_provider_status;

/// Check for error codes.
StandardIntegrityErrorCode error_code =
        StandardIntegrityTokenProvider_getStatus(tokenProvider, &token_provider_status);
if (error_code == STANDARD_INTEGRITY_NO_ERROR
    && token_provider_status == INTEGRITY_RESPONSE_COMPLETED)
{
    /// continue to request token from the token provider
}
/// ...
/// Remember to free up resources.
PrepareIntegrityTokenRequest_destroy(tokenProviderRequest);

টেম্পারিংয়ের বিরুদ্ধে অনুরোধ রক্ষা করুন (প্রস্তাবিত)

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

যখন আপনি একটি সততা রায়ের জন্য অনুরোধ করেন:

  • ব্যবহারকারীর অ্যাকশন বা সার্ভারের অনুরোধ যা ঘটছে তা থেকে সমস্ত প্রাসঙ্গিক অনুরোধের প্যারামিটারের একটি ডাইজেস্ট গণনা করুন (যেমন একটি স্থিতিশীল অনুরোধ ক্রমিককরণের SHA256)। requestHash ফিল্ডে সেট করা মানটির সর্বোচ্চ দৈর্ঘ্য 500 বাইট। requestHash যেকোন অ্যাপ রিকোয়েস্ট ডেটা অন্তর্ভুক্ত করুন যা আপনি যে ক্রিয়াটি পরীক্ষা করছেন বা রক্ষা করছেন তার সাথে গুরুত্বপূর্ণ বা প্রাসঙ্গিক। requestHash ক্ষেত্রটি অখণ্ডতা টোকেন শব্দে অন্তর্ভুক্ত করা হয়েছে, তাই দীর্ঘ মান অনুরোধের আকার বাড়াতে পারে।
  • Play Integrity API-এ requestHash ফিল্ড হিসেবে ডাইজেস্ট প্রদান করুন এবং ইন্টিগ্রিটি টোকেন পান।

যখন আপনি একটি অখণ্ডতার রায় পান:

  • অখণ্ডতা টোকেন ডিকোড করুন এবং requestHash ক্ষেত্রটি বের করুন।
  • অ্যাপের মতো একই পদ্ধতিতে অনুরোধের একটি ডাইজেস্ট গণনা করুন (যেমন একটি স্থিতিশীল অনুরোধের ক্রমিককরণের SHA256)।
  • অ্যাপ-সাইড এবং সার্ভার-সাইড ডাইজেস্টের তুলনা করুন। যদি তারা মেলে না, অনুরোধ বিশ্বাসযোগ্য নয়।

একটি সততা রায়ের অনুরোধ করুন (চাহিদা অনুযায়ী)

আপনি অখণ্ডতা টোকেন প্রদানকারী প্রস্তুত করার পরে, আপনি Google Play থেকে অখণ্ডতার রায়ের অনুরোধ করা শুরু করতে পারেন৷ এটি করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

  1. উপরে দেখানো হিসাবে একটি StandardIntegrityTokenProvider পান।
  2. একটি StandardIntegrityTokenRequest তৈরি করুন, আপনি setRequestHash পদ্ধতির মাধ্যমে যে ব্যবহারকারীর অ্যাকশনটি রক্ষা করতে চান তার অনুরোধ হ্যাশ সরবরাহ করে।
  3. StandardIntegrityTokenRequest সরবরাহ করে request() কল করতে ইন্টিগ্রিটি টোকেন প্রদানকারী ব্যবহার করুন।

জাভা

import com.google.android.gms.tasks.Task;

StandardIntegrityTokenProvider integrityTokenProvider;

// See above how to prepare integrityTokenProvider.

// Request integrity token by providing a user action request hash. Can be called
// several times for different user actions.
String requestHash = "2cp24z...";
Task<StandardIntegrityToken> integrityTokenResponse =
    integrityTokenProvider.request(
        StandardIntegrityTokenRequest.builder()
            .setRequestHash(requestHash)
            .build());
integrityTokenResponse
    .addOnSuccessListener(response -> sendToServer(response.token()))
    .addOnFailureListener(exception -> handleError(exception));

ঐক্য

IEnumerator RequestIntegrityTokenCoroutine() {
    StandardIntegrityTokenProvider integrityTokenProvider;

    // See above how to prepare integrityTokenProvider.

    // Request integrity token by providing a user action request hash. Can be called
    // several times for different user actions.
    String requestHash = "2cp24z...";
    var integrityTokenOperation = integrityTokenProvider.Request(
      new StandardIntegrityTokenRequest(requestHash)
    );

    // Wait for PlayAsyncOperation to complete.
    yield return integrityTokenOperation;

    // Check the resulting error code.
    if (integrityTokenOperation.Error != StandardIntegrityErrorCode.NoError)
    {
        AppendStatusLog("StandardIntegrityAsyncOperation failed with error: " +
                integrityTokenOperation.Error);
        yield break;
    }

    // Get the response.
    var integrityToken = integrityTokenOperation.GetResult();
}

স্থানীয়

/// Create a StandardIntegrityTokenRequest opaque object.
const char* requestHash = ...;
StandardIntegrityTokenRequest* tokenRequest;
StandardIntegrityTokenRequest_create(&tokenRequest);
StandardIntegrityTokenRequest_setRequestHash(tokenRequest, requestHash);

/// Prepare a StandardIntegrityToken opaque type pointer and call
/// StandardIntegrityTokenProvider_request(). Can be called several times for
/// different user actions. See above how to prepare token provider.
StandardIntegrityToken* token;
StandardIntegrityErrorCode error_code =
        StandardIntegrityTokenProvider_request(tokenProvider, tokenRequest, &token);

/// ...
/// Proceed to polling iff error_code == STANDARD_INTEGRITY_NO_ERROR
if (error_code != STANDARD_INTEGRITY_NO_ERROR)
{
    /// Remember to call the *_destroy() functions.
    return;
}
/// ...
/// Use polling to wait for the async operation to complete.

IntegrityResponseStatus token_status;

/// Check for error codes.
StandardIntegrityErrorCode error_code =
        StandardIntegrityToken_getStatus(token, &token_status);
if (error_code == STANDARD_INTEGRITY_NO_ERROR
    && token_status == INTEGRITY_RESPONSE_COMPLETED)
{
    const char* integrityToken = StandardIntegrityToken_getToken(token);
}
/// ...
/// Remember to free up resources.
StandardIntegrityTokenRequest_destroy(tokenRequest);
StandardIntegrityToken_destroy(token);
StandardIntegrityTokenProvider_destroy(tokenProvider);
StandardIntegrityManager_destroy();

অখণ্ডতার রায় ডিক্রিপ্ট করুন এবং যাচাই করুন

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

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

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

ফলস্বরূপ পেলোড হল একটি প্লেইন-টেক্সট টোকেন যাতে অখণ্ডতার রায় রয়েছে।

স্বয়ংক্রিয় রিপ্লে সুরক্ষা

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