সার্ভার-সাইড যাচাইকরণ (SSV) কলব্যাকগুলি যাচাই করুন, সার্ভার-সাইড যাচাইকরণ (SSV) কলব্যাকগুলি যাচাই করুন, সার্ভার-সাইড যাচাইকরণ (SSV) কলব্যাকগুলিকে বৈধ করুন


সার্ভার-সাইড ভেরিফিকেশন কলব্যাক হল URL অনুরোধ, Google দ্বারা প্রসারিত ক্যোয়ারী প্যারামিটার সহ, যেগুলি Google দ্বারা একটি বহিরাগত সিস্টেমে পাঠানো হয় যাতে এটি জানানো হয় যে একজন ব্যবহারকারীকে পুরস্কৃত বা পুরস্কৃত ইন্টারস্টিশিয়াল বিজ্ঞাপনের সাথে ইন্টারঅ্যাক্ট করার জন্য পুরস্কৃত করা উচিত। পুরস্কৃত SSV (সার্ভার-সাইড যাচাইকরণ) কলব্যাকগুলি ব্যবহারকারীদের পুরস্কৃত করার জন্য ক্লায়েন্ট-সাইড কলব্যাকগুলির স্পুফিংয়ের বিরুদ্ধে সুরক্ষার একটি অতিরিক্ত স্তর সরবরাহ করে৷

এই নির্দেশিকাটি আপনাকে দেখায় কিভাবে Tink Java Apps থার্ড-পার্টি ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করে পুরস্কৃত SSV কলব্যাকগুলি যাচাই করতে হয় যাতে কলব্যাকের ক্যোয়ারী প্যারামিটারগুলি বৈধ মান। যদিও এই গাইডের উদ্দেশ্যে Tink ব্যবহার করা হয়, আপনার কাছে ECDSA সমর্থন করে এমন কোনো তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করার বিকল্প আছে। এছাড়াও আপনি AdMob UI-তে টেস্টিং টুল দিয়ে আপনার সার্ভার পরীক্ষা করতে পারেন।

জাভা স্প্রিং-বুট ব্যবহার করে এই সম্পূর্ণ কার্যকরী উদাহরণটি দেখুন।

পূর্বশর্ত

Tink Java Apps লাইব্রেরি থেকে RewardedAdsVerifier ব্যবহার করুন

Tink Java Apps GitHub সংগ্রহস্থলে একটি পুরস্কৃত SSV কলব্যাক যাচাই করার জন্য প্রয়োজনীয় কোড কমাতে একটি RewardedAdsVerifier সহায়ক শ্রেণী অন্তর্ভুক্ত রয়েছে। এই ক্লাসটি ব্যবহার করে আপনি নিম্নলিখিত কোড সহ একটি কলব্যাক URL যাচাই করতে পারবেন৷

RewardedAdsVerifier verifier = new RewardedAdsVerifier.Builder()
    .fetchVerifyingPublicKeysWith(
        RewardedAdsVerifier.KEYS_DOWNLOADER_INSTANCE_PROD)
    .build();
String rewardUrl = ...;
verifier.verify(rewardUrl);

যদি verify() পদ্ধতিটি কোনো ব্যতিক্রম ছাড়াই কার্যকর হয়, তাহলে কলব্যাক URL সফলভাবে যাচাই করা হয়েছে। ব্যবহারকারীদের কখন পুরস্কৃত করা উচিত সে সম্পর্কিত সেরা অনুশীলনের বিবরণ ব্যবহারকারী বিভাগে পুরস্কৃত করা হয়েছে । পুরস্কৃত SSV কলব্যাক যাচাই করার জন্য এই শ্রেণীর দ্বারা সম্পাদিত পদক্ষেপগুলির একটি ব্রেকডাউনের জন্য, আপনি পুরস্কৃত SSV বিভাগের ম্যানুয়াল যাচাইকরণের মাধ্যমে পড়তে পারেন।

SSV কলব্যাক পরামিতি

সার্ভার-সাইড যাচাইকরণ কলব্যাকগুলিতে ক্যোয়ারী প্যারামিটার থাকে যা পুরস্কৃত বিজ্ঞাপন ইন্টারঅ্যাকশন বর্ণনা করে। প্যারামিটারের নাম, বর্ণনা এবং উদাহরণের মান নীচে তালিকাভুক্ত করা হয়েছে। পরামিতিগুলি বর্ণানুক্রমিকভাবে পাঠানো হয়।

প্যারামিটারের নাম বর্ণনা উদাহরণ মান
ad_network যে বিজ্ঞাপনটি এই বিজ্ঞাপনটি পূরণ করেছে সেই বিজ্ঞাপন উৎসের জন্য বিজ্ঞাপন উৎস শনাক্তকারী। আইডি মানগুলির সাথে সম্পর্কিত বিজ্ঞাপন উত্সের নামগুলি বিজ্ঞাপন উত্স সনাক্তকারী বিভাগে তালিকাভুক্ত করা হয়েছে৷ 1953547073528090325
বিজ্ঞাপন_ইউনিট AdMob বিজ্ঞাপন ইউনিট আইডি যা পুরস্কৃত বিজ্ঞাপনের অনুরোধ করতে ব্যবহৃত হয়েছিল। 2747237135
কাস্টম_ডেটা দ্বারা প্রদত্ত কাস্টম ডেটা স্ট্রিং ServerSideVerificationOptions::custom_data .

যদি অ্যাপ দ্বারা কোনো কাস্টম ডেটা স্ট্রিং প্রদান না করা হয়, তাহলে এই ক্যোয়ারী প্যারামিটার মান SSV কলব্যাকে উপস্থিত থাকবে না।

SAMPLE_CUSTOM_DATA_STRING
key_id SSV কলব্যাক যাচাই করতে ব্যবহার করা কী। এই মানটি AdMob কী সার্ভার দ্বারা প্রদত্ত একটি সর্বজনীন কী-তে মানচিত্র করে। 1234567890
পুরস্কার_অর্থ বিজ্ঞাপন ইউনিট সেটিংসে উল্লেখ করা পুরস্কারের পরিমাণ। 5
reward_item বিজ্ঞাপন ইউনিট সেটিংসে উল্লেখ করা পুরস্কার আইটেম। মুদ্রা
স্বাক্ষর AdMob দ্বারা জেনারেট করা SSV কলব্যাকের জন্য স্বাক্ষর৷ MEUCIQCLJS_s4ia_sN06HqzeW7Wc3nhZi4RlW3qV0oO-6AIYdQIgGJEh-rzKreO-paNDbSCzWGMtmgJHYYW9k2_icM9LFMY
টাইমস্ট্যাম্প যখন ব্যবহারকারীকে ms-এ Epoch time হিসাবে পুরস্কৃত করা হয়েছিল তার টাইমস্ট্যাম্প৷ 1507770365237823
লেনদেন_আইডি AdMob দ্বারা জেনারেট করা প্রতিটি পুরস্কার অনুদান ইভেন্টের জন্য অনন্য হেক্স এনকোড করা শনাক্তকারী। 18fa792de1bca816048293fc71035638
user_id ব্যবহারকারী শনাক্তকারী হিসাবে প্রদান করা হয়েছেServerSideVerificationOptions::user_id

অ্যাপ দ্বারা কোনো ব্যবহারকারী শনাক্তকারী প্রদান করা না হলে, এই ক্যোয়ারী প্যারামিটারটি SSV কলব্যাকে উপস্থিত থাকবে না।

1234567

বিজ্ঞাপন উৎস শনাক্তকারী

বিজ্ঞাপন উৎসের নাম এবং আইডি

বিজ্ঞাপন উৎসের নাম বিজ্ঞাপন উৎস আইডি
আরকি (দরপত্র) 5240798063227064260
বিজ্ঞাপন প্রজন্ম (বিডিং) 1477265452970951479
অ্যাডকলোনি 15586990674969969776
অ্যাডকলোনি (এসডিকে নয়) (বিডিং) 4600416542059544716
অ্যাডকলোনি (বিডিং) 6895345910719072481
অ্যাডফ্যালকন 3528208921554210682
AdMob নেটওয়ার্ক 5450213213286189855
AdMob নেটওয়ার্ক জলপ্রপাত 1215381445328257950
ADR ফলাফল 10593873382626181482
AMoAd 17253994435944008978
অ্যাপলোভিন 1063618907739174004
অ্যাপলোভিন (নিলাম) 1328079684332308356
চার্টবুস্ট 2873236629771172317
চকোলেট প্ল্যাটফর্ম (বিডিং) 6432849193975106527
ক্রসচ্যানেল (MdotM) 9372067028804390441
কাস্টম ইভেন্ট 18351550913290782395
ডিটি এক্সচেঞ্জ*
* 21শে সেপ্টেম্বর, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফাইবার মার্কেটপ্লেস" বলা হত।
2179455223494392917
EMX (বিডিং) 8497809869790333482
ফ্লাক্ট (বিডিং) 8419777862490735710
ফ্লারি 3376427960656545613
ফাইবার*
* এই বিজ্ঞাপন উৎস ঐতিহাসিক রিপোর্টিং জন্য ব্যবহার করা হয়.
4839637394546996422
i-মোবাইল 5208827440166355534
ডিজিটাল উন্নত করুন (বিডিং) 159382223051638006
ইনডেক্স এক্সচেঞ্জ (বিডিং) 4100650709078789802
InMobi 7681903010231960328
InMobi (বিডিং) 6325663098072678541
ইনমোবি এক্সচেঞ্জ (বিডিং) 5264320421916134407
আয়রনসোর্স 6925240245545091930
আয়রনসোর্স বিজ্ঞাপন (বিডিং) 1643326773739866623
লিডবোল্ট 2899150749497968595
LG U+AD 18298738678491729107
লাইন বিজ্ঞাপন নেটওয়ার্ক 3025503711505004547
মায়ো 7505118203095108657
মায়ো (বিডিং) 1343336733822567166
Media.net (বিডিং) 2127936450554446159
মধ্যস্থতা হাউস বিজ্ঞাপন 6060308706800320801
মেটা অডিয়েন্স নেটওয়ার্ক*
* 6 জুন, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফেসবুক অডিয়েন্স নেটওয়ার্ক" বলা হত।
10568273599589928883
মেটা অডিয়েন্স নেটওয়ার্ক (বিডিং)*
* 6 জুন, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফেসবুক অডিয়েন্স নেটওয়ার্ক (বিডিং)" বলা হত।
11198165126854996598
মিন্টেগ্রাল 1357746574408896200
মিন্টেগ্রাল (বিডিং) 6250601289653372374
MobFox 8079529624516381459
MobFox (বিডিং) 3086513548163922365
MoPub ( অপ্রচলিত ) 10872986198578383917
আমার টার্গেট 8450873672465271579
নেন্ড 9383070032774777750
নেক্সেন (বিডিং)*

* 1 মে, 2024 এর আগে, এই নেটওয়ার্কটিকে "UnrulyX" বলা হত।

2831998725945605450
AOL দ্বারা ONE (সহস্রাব্দ মিডিয়া) 6101072188699264581
AOL দ্বারা ONE (Nexage) 3224789793037044399
OneTag Exchange (বিডিং) 4873891452523427499
OpenX (বিডিং) 4918705482605678398
প্যাঙ্গেল 4069896914521993236
প্যাঙ্গেল (বিডিং) 3525379893916449117
পাবম্যাটিক (বিডিং) 3841544486172445473
সংরক্ষণ অভিযান 7068401028668408324
RhythmOne (বিডিং) 2831998725945605450
রুবিকন (বিডিং) 3993193775968767067
এসকে গ্রহ 734341340207269415
শেয়ারথ্রু (বিডিং) 5247944089976324188
Smaato (নিলাম) 3362360112145450544
সমতুল্য (বিডিং)*

* 12 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "স্মার্ট অ্যাডসার্ভার" বলা হত।

5970199210771591442
সোনোবি (নিলাম) 3270984106996027150
ট্যাপজয় 7295217276740746030
ট্যাপজয় (নিলাম) 4692500501762622178
টেনসেন্ট জিডিটি 7007906637038700218
ট্রিপললিফ্ট (বিডিং) 8332676245392738510
ইউনিটি বিজ্ঞাপন 4970775877303683148
ইউনিটি বিজ্ঞাপন (বিডিং) 7069338991535737586
ভেরিজন মিডিয়া 7360851262951344112
ভার্ভ গ্রুপ (বিডিং) 5013176581647059185
Vpon 1940957084538325905
লিফটঅফ নগদীকরণ*

* 30 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "ভাংগল" বলা হত।

1953547073528090325
লিফটঅফ মনিটাইজ (বিডিং)*

* 30 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "ভাংলে (বিডিং)" বলা হত।

4692500501762622185
Yieldmo (বিডিং) 4193081836471107579
YieldOne (বিডিং) 3154533971590234104
জুক্স 5506531810221735863

ব্যবহারকারীকে পুরস্কৃত করা

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

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

কাস্টম ডেটা

যে অ্যাপগুলির সার্ভার-সাইড যাচাইকরণ কলব্যাকে অতিরিক্ত ডেটার প্রয়োজন হয় তাদের পুরস্কৃত বিজ্ঞাপনগুলির কাস্টম ডেটা বৈশিষ্ট্য ব্যবহার করা উচিত। পুরস্কৃত বিজ্ঞাপন অবজেক্টে সেট করা যেকোনো স্ট্রিং মান SSV কলব্যাকের custom_data ক্যোয়ারী প্যারামিটারে পাস করা হয়। যদি কোনো কাস্টম ডেটা মান সেট করা না থাকে, custom_data ক্যোয়ারী প্যারামিটার মান SSV কলব্যাকে উপস্থিত থাকবে না।

নিচের কোড নমুনাটি দেখায় যে কিভাবে একটি বিজ্ঞাপনের অনুরোধ করার আগে একটি পুরস্কৃত বিজ্ঞাপন বস্তুতে কাস্টম ডেটা সেট করতে হয়।

  firebase::gma::RewardedAd* rewarded_ad;
  rewarded_ad = new firebase::gma::RewardedAd();

  firebase::gma::RewardedAd::ServerSideVerificationOptions options;
  options.custom_data = "SAMPLE_CUSTOM_DATA_STRING";
  rewarded_ad->SetServerSideVerificationOptions(options);

আপনি যদি কাস্টম পুরষ্কার স্ট্রিং সেট করতে চান তবে আপনাকে বিজ্ঞাপন দেখানোর আগে তা করতে হবে।

পুরস্কৃত SSV-এর ম্যানুয়াল যাচাইকরণ

একটি পুরস্কৃত SSV যাচাই করার জন্য RewardedAdsVerifier ক্লাস দ্বারা সম্পাদিত পদক্ষেপগুলি নীচে বর্ণিত হয়েছে৷ যদিও অন্তর্ভুক্ত কোড স্নিপেটগুলি জাভাতে রয়েছে এবং Tink থার্ড-পার্টি লাইব্রেরি ব্যবহার করে, এই পদক্ষেপগুলি আপনার দ্বারা আপনার পছন্দের ভাষায় প্রয়োগ করা যেতে পারে, ECDSA সমর্থন করে এমন কোনও তৃতীয়-পক্ষের লাইব্রেরি ব্যবহার করে।

সর্বজনীন কীগুলি আনুন৷

একটি পুরস্কৃত SSV কলব্যাক যাচাই করতে, আপনার AdMob দ্বারা সরবরাহ করা একটি সর্বজনীন কী প্রয়োজন৷

পুরস্কৃত SSV কলব্যাকগুলি যাচাই করতে ব্যবহার করা সর্বজনীন কীগুলির একটি তালিকা AdMob কী সার্ভার থেকে আনা যেতে পারে৷ সর্বজনীন কীগুলির তালিকা নিম্নলিখিতগুলির মতো একটি বিন্যাস সহ JSON উপস্থাপনা হিসাবে সরবরাহ করা হয়েছে:

{
 "keys": [
    {
      keyId: 1916455855,
      pem: "-----BEGIN PUBLIC KEY-----\nMF...YTPcw==\n-----END PUBLIC KEY-----"
      base64: "MFkwEwYHKoZIzj0CAQYI...ltS4nzc9yjmhgVQOlmSS6unqvN9t8sqajRTPcw=="
    },
    {
      keyId: 3901585526,
      pem: "-----BEGIN PUBLIC KEY-----\nMF...aDUsw==\n-----END PUBLIC KEY-----"
      base64: "MFYwEAYHKoZIzj0CAQYF...4akdWbWDCUrMMGIV27/3/e7UuKSEonjGvaDUsw=="
    },
  ],
}

সর্বজনীন কীগুলি পুনরুদ্ধার করতে, AdMob কী সার্ভারের সাথে সংযোগ করুন এবং কীগুলি ডাউনলোড করুন৷ নিম্নলিখিত কোডটি এই কাজটি সম্পন্ন করে এবং data ভেরিয়েবলের কীগুলির JSON উপস্থাপনা সংরক্ষণ করে।

String url = ...;
NetHttpTransport httpTransport = new NetHttpTransport.Builder().build();
HttpRequest httpRequest =
    httpTransport.createRequestFactory().buildGetRequest(new GenericUrl(url));
HttpResponse httpResponse = httpRequest.execute();
if (httpResponse.getStatusCode() != HttpStatusCodes.STATUS_CODE_OK) {
  throw new IOException("Unexpected status code = " + httpResponse.getStatusCode());
}
String data;
InputStream contentStream = httpResponse.getContent();
try {
  InputStreamReader reader = new InputStreamReader(contentStream, UTF_8);
  data = readerToString(reader);
} finally {
  contentStream.close();
}

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

একবার সর্বজনীন কীগুলি আনা হয়ে গেলে, সেগুলি অবশ্যই পার্স করা উচিত৷ নীচের parsePublicKeysJson পদ্ধতিটি একটি JSON স্ট্রিং নেয়, যেমন উপরের উদাহরণ, ইনপুট হিসাবে, এবং key_id মান থেকে পাবলিক কীগুলিতে একটি ম্যাপিং তৈরি করে, যেগুলি Tink লাইব্রেরি থেকে ECPublicKey অবজেক্ট হিসাবে এনক্যাপসুলেট করা হয়।

private static Map<Integer, ECPublicKey> parsePublicKeysJson(String publicKeysJson)
    throws GeneralSecurityException {
  Map<Integer, ECPublicKey> publicKeys = new HashMap<>();
  try {
    JSONArray keys = new JSONObject(publicKeysJson).getJSONArray("keys");
    for (int i = 0; i < keys.length(); i++) {
      JSONObject key = keys.getJSONObject(i);
      publicKeys.put(
          key.getInt("keyId"),
          EllipticCurves.getEcPublicKey(Base64.decode(key.getString("base64"))));
    }
  } catch (JSONException e) {
    throw new GeneralSecurityException("failed to extract trusted signing public keys", e);
  }
  if (publicKeys.isEmpty()) {
    throw new GeneralSecurityException("No trusted keys are available.");
  }
  return publicKeys;
}

যাচাই করার জন্য সামগ্রী পান

পুরস্কৃত SSV কলব্যাকের শেষ দুটি ক্যোয়ারী প্যারামিটার সর্বদা signature এবং key_id, সেই ক্রমে। অবশিষ্ট ক্যোয়ারী পরামিতিগুলি যাচাই করা বিষয়বস্তু নির্দিষ্ট করে৷ ধরুন আপনি https://www.myserver.com/mypath এ পুরস্কার কলব্যাক পাঠাতে AdMob কনফিগার করেছেন। নীচের স্নিপেটটি হাইলাইট করা যাচাই করা বিষয়বস্তুর সাথে পুরস্কৃত SSV কলব্যাকের একটি উদাহরণ দেখায়।

https://www.myserver.com/path?ad_network=54...55&ad_unit=12345678&reward_amount=10&reward_item=coins
&timestamp=150777823&transaction_id=12...DEF&user_id=1234567&signature=ME...Z1c&key_id=1268887

একটি UTF-8 বাইট অ্যারে হিসাবে একটি কলব্যাক URL থেকে যাচাই করার জন্য সামগ্রীকে কীভাবে পার্স করতে হয় তা নীচের কোডটি প্রদর্শন করে৷

public static final String SIGNATURE_PARAM_NAME = "signature=";
...
URI uri;
try {
  uri = new URI(rewardUrl);
} catch (URISyntaxException ex) {
  throw new GeneralSecurityException(ex);
}
String queryString = uri.getQuery();
int i = queryString.indexOf(SIGNATURE_PARAM_NAME);
if (i == -1) {
  throw new GeneralSecurityException("needs a signature query parameter");
}
byte[] queryParamContentData =
    queryString
        .substring(0, i - 1)
        // i - 1 instead of i because of & in the query string
        .getBytes(Charset.forName("UTF-8"));

কলব্যাক URL থেকে স্বাক্ষর এবং key_id পান

পূর্ববর্তী ধাপ থেকে queryString মান ব্যবহার করে, নীচে দেখানো হিসাবে কলব্যাক URL থেকে signature এবং key_id ক্যোয়ারী প্যারামিটার পার্স করুন:

public static final String KEY_ID_PARAM_NAME = "key_id=";
...
String sigAndKeyId = queryString.substring(i);
i = sigAndKeyId.indexOf(KEY_ID_PARAM_NAME);
if (i == -1) {
  throw new GeneralSecurityException("needs a key_id query parameter");
}
String sig =
    sigAndKeyId.substring(
        SIGNATURE_PARAM_NAME.length(), i - 1 /* i - 1 instead of i because of & */);
int keyId = Integer.valueOf(sigAndKeyId.substring(i + KEY_ID_PARAM_NAME.length()));

যাচাইকরণ সঞ্চালন

চূড়ান্ত পদক্ষেপ হল উপযুক্ত সর্বজনীন কী দিয়ে কলব্যাক URL-এর বিষয়বস্তু যাচাই করা। parsePublicKeysJson পদ্ধতি থেকে ফেরত ম্যাপিং নিন এবং সেই ম্যাপিং থেকে সর্বজনীন কী পেতে কলব্যাক URL থেকে key_id প্যারামিটার ব্যবহার করুন। তারপর সেই পাবলিক কী দিয়ে স্বাক্ষর যাচাই করুন। এই পদক্ষেপগুলি verify পদ্ধতিতে নীচে প্রদর্শিত হয়েছে।

private void verify(final byte[] dataToVerify, int keyId, final byte[] signature)
    throws GeneralSecurityException {
  Map<Integer, ECPublicKey> publicKeys = parsePublicKeysJson();
  if (publicKeys.containsKey(keyId)) {
    foundKeyId = true;
    ECPublicKey publicKey = publicKeys.get(keyId);
    EcdsaVerifyJce verifier = new EcdsaVerifyJce(publicKey, HashType.SHA256, EcdsaEncoding.DER);
    verifier.verify(signature, dataToVerify);
  } else {
    throw new GeneralSecurityException("cannot find verifying key with key ID: " + keyId);
  }
}

যদি পদ্ধতিটি কোনো ব্যতিক্রম ছাড়াই কার্যকর হয়, তাহলে কলব্যাক URL সফলভাবে যাচাই করা হয়েছে।

FAQ

আমি কি AdMob কী সার্ভারের দেওয়া সর্বজনীন কী ক্যাশে করতে পারি?
আমরা সুপারিশ করি যে আপনি SSV কলব্যাকগুলিকে যাচাই করার জন্য প্রয়োজনীয় ক্রিয়াকলাপগুলির সংখ্যা কমাতে AdMob কী সার্ভার দ্বারা সরবরাহিত সর্বজনীন কীটি ক্যাশে করুন৷ যাইহোক, মনে রাখবেন যে সর্বজনীন কীগুলি নিয়মিত ঘোরানো হয় এবং 24 ঘন্টার বেশি সময় ধরে ক্যাশে করা উচিত নয়৷
AdMob কী সার্ভার দ্বারা সরবরাহ করা সর্বজনীন কীগুলি কত ঘন ঘন ঘোরানো হয়?
AdMob কী সার্ভার দ্বারা প্রদত্ত সর্বজনীন কীগুলি পরিবর্তনশীল সময়সূচীতে ঘোরানো হয়। নিশ্চিত করতে যে SSV কলব্যাকগুলির যাচাইকরণ উদ্দেশ্য অনুযায়ী কাজ করে চলেছে, সর্বজনীন কীগুলি 24 ঘন্টার বেশি ক্যাশে করা উচিত নয়৷
আমার সার্ভারে পৌঁছাতে না পারলে কী হবে?
Google SSV কলব্যাকের জন্য একটি HTTP 200 OK সাফল্যের স্থিতি প্রতিক্রিয়া কোড আশা করে৷ যদি আপনার সার্ভারে পৌঁছানো না যায় বা প্রত্যাশিত প্রতিক্রিয়া প্রদান না করে, Google এক-সেকেন্ডের ব্যবধানে পাঁচ বার পর্যন্ত SSV কলব্যাক পাঠানোর পুনরায় চেষ্টা করবে।
আমি কিভাবে যাচাই করতে পারি যে SSV কলব্যাকগুলি Google থেকে আসছে?
SSV কলব্যাকগুলি Google থেকে এসেছে তা যাচাই করতে বিপরীত DNS লুকআপ ব্যবহার করুন৷
,


সার্ভার-সাইড ভেরিফিকেশন কলব্যাক হল URL অনুরোধ, Google দ্বারা প্রসারিত ক্যোয়ারী প্যারামিটার সহ, যেগুলি Google দ্বারা একটি বহিরাগত সিস্টেমে পাঠানো হয় যাতে এটি জানানো হয় যে একজন ব্যবহারকারীকে পুরস্কৃত বা পুরস্কৃত ইন্টারস্টিশিয়াল বিজ্ঞাপনের সাথে ইন্টারঅ্যাক্ট করার জন্য পুরস্কৃত করা উচিত। পুরস্কৃত SSV (সার্ভার-সাইড যাচাইকরণ) কলব্যাকগুলি ব্যবহারকারীদের পুরস্কৃত করার জন্য ক্লায়েন্ট-সাইড কলব্যাকগুলির স্পুফিংয়ের বিরুদ্ধে সুরক্ষার একটি অতিরিক্ত স্তর সরবরাহ করে৷

এই নির্দেশিকাটি আপনাকে দেখায় কিভাবে Tink Java Apps থার্ড-পার্টি ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করে পুরস্কৃত SSV কলব্যাকগুলি যাচাই করতে হয় যাতে কলব্যাকের ক্যোয়ারী প্যারামিটারগুলি বৈধ মান। যদিও এই গাইডের উদ্দেশ্যে Tink ব্যবহার করা হয়, আপনার কাছে ECDSA সমর্থন করে এমন কোনো তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করার বিকল্প আছে। এছাড়াও আপনি AdMob UI-তে টেস্টিং টুল দিয়ে আপনার সার্ভার পরীক্ষা করতে পারেন।

জাভা স্প্রিং-বুট ব্যবহার করে এই সম্পূর্ণ কার্যকরী উদাহরণটি দেখুন।

পূর্বশর্ত

Tink Java Apps লাইব্রেরি থেকে RewardedAdsVerifier ব্যবহার করুন

Tink Java Apps GitHub সংগ্রহস্থলে একটি পুরস্কৃত SSV কলব্যাক যাচাই করার জন্য প্রয়োজনীয় কোড কমাতে একটি RewardedAdsVerifier সহায়ক শ্রেণী অন্তর্ভুক্ত রয়েছে। এই ক্লাসটি ব্যবহার করে আপনি নিম্নলিখিত কোড সহ একটি কলব্যাক URL যাচাই করতে পারবেন৷

RewardedAdsVerifier verifier = new RewardedAdsVerifier.Builder()
    .fetchVerifyingPublicKeysWith(
        RewardedAdsVerifier.KEYS_DOWNLOADER_INSTANCE_PROD)
    .build();
String rewardUrl = ...;
verifier.verify(rewardUrl);

যদি verify() পদ্ধতিটি কোনো ব্যতিক্রম ছাড়াই কার্যকর হয়, তাহলে কলব্যাক URL সফলভাবে যাচাই করা হয়েছে। ব্যবহারকারীদের কখন পুরস্কৃত করা উচিত সে সম্পর্কিত সেরা অনুশীলনের বিবরণ ব্যবহারকারী বিভাগে পুরস্কৃত করা হয়েছে । পুরস্কৃত SSV কলব্যাক যাচাই করার জন্য এই শ্রেণীর দ্বারা সম্পাদিত পদক্ষেপগুলির একটি ব্রেকডাউনের জন্য, আপনি পুরস্কৃত SSV বিভাগের ম্যানুয়াল যাচাইকরণের মাধ্যমে পড়তে পারেন।

SSV কলব্যাক পরামিতি

সার্ভার-সাইড যাচাইকরণ কলব্যাকগুলিতে ক্যোয়ারী প্যারামিটার থাকে যা পুরস্কৃত বিজ্ঞাপন ইন্টারঅ্যাকশন বর্ণনা করে। প্যারামিটারের নাম, বর্ণনা এবং উদাহরণের মান নীচে তালিকাভুক্ত করা হয়েছে। পরামিতিগুলি বর্ণানুক্রমিকভাবে পাঠানো হয়।

প্যারামিটারের নাম বর্ণনা উদাহরণ মান
ad_network যে বিজ্ঞাপনটি এই বিজ্ঞাপনটি পূরণ করেছে সেই বিজ্ঞাপন উৎসের জন্য বিজ্ঞাপন উৎস শনাক্তকারী। আইডি মানগুলির সাথে সম্পর্কিত বিজ্ঞাপন উত্সের নামগুলি বিজ্ঞাপন উত্স সনাক্তকারী বিভাগে তালিকাভুক্ত করা হয়েছে৷ 1953547073528090325
বিজ্ঞাপন_ইউনিট AdMob বিজ্ঞাপন ইউনিট আইডি যা পুরস্কৃত বিজ্ঞাপনের অনুরোধ করতে ব্যবহৃত হয়েছিল। 2747237135
কাস্টম_ডেটা দ্বারা প্রদত্ত কাস্টম ডেটা স্ট্রিং ServerSideVerificationOptions::custom_data .

যদি অ্যাপ দ্বারা কোনো কাস্টম ডেটা স্ট্রিং প্রদান না করা হয়, তাহলে এই ক্যোয়ারী প্যারামিটার মান SSV কলব্যাকে উপস্থিত থাকবে না।

SAMPLE_CUSTOM_DATA_STRING
key_id SSV কলব্যাক যাচাই করতে ব্যবহার করা কী। এই মানটি AdMob কী সার্ভার দ্বারা প্রদত্ত একটি সর্বজনীন কী-তে মানচিত্র করে। 1234567890
পুরস্কার_অর্থ বিজ্ঞাপন ইউনিট সেটিংসে উল্লেখ করা পুরস্কারের পরিমাণ। 5
reward_item বিজ্ঞাপন ইউনিট সেটিংসে উল্লেখ করা পুরস্কার আইটেম। মুদ্রা
স্বাক্ষর AdMob দ্বারা জেনারেট করা SSV কলব্যাকের জন্য স্বাক্ষর৷ MEUCIQCLJS_s4ia_sN06HqzeW7Wc3nhZi4RlW3qV0oO-6AIYdQIgGJEh-rzKreO-paNDbSCzWGMtmgJHYYW9k2_icM9LFMY
টাইমস্ট্যাম্প যখন ব্যবহারকারীকে ms-এ Epoch time হিসাবে পুরস্কৃত করা হয়েছিল তার টাইমস্ট্যাম্প৷ 1507770365237823
লেনদেন_আইডি AdMob দ্বারা জেনারেট করা প্রতিটি পুরস্কার অনুদান ইভেন্টের জন্য অনন্য হেক্স এনকোড করা শনাক্তকারী। 18fa792de1bca816048293fc71035638
user_id ব্যবহারকারী শনাক্তকারী হিসাবে প্রদান করা হয়েছেServerSideVerificationOptions::user_id

অ্যাপ দ্বারা কোনো ব্যবহারকারী শনাক্তকারী প্রদান করা না হলে, এই ক্যোয়ারী প্যারামিটারটি SSV কলব্যাকে উপস্থিত থাকবে না।

1234567

বিজ্ঞাপন উৎস শনাক্তকারী

বিজ্ঞাপন উৎসের নাম এবং আইডি

বিজ্ঞাপন উৎসের নাম বিজ্ঞাপন উৎস আইডি
আরকি (দরপত্র) 5240798063227064260
বিজ্ঞাপন প্রজন্ম (বিডিং) 1477265452970951479
অ্যাডকলোনি 15586990674969969776
অ্যাডকলোনি (এসডিকে নয়) (বিডিং) 4600416542059544716
অ্যাডকলোনি (বিডিং) 6895345910719072481
অ্যাডফ্যালকন 3528208921554210682
AdMob নেটওয়ার্ক 5450213213286189855
AdMob নেটওয়ার্ক জলপ্রপাত 1215381445328257950
ADR ফলাফল 10593873382626181482
AMoAd 17253994435944008978
অ্যাপলোভিন 1063618907739174004
অ্যাপলোভিন (নিলাম) 1328079684332308356
চার্টবুস্ট 2873236629771172317
চকোলেট প্ল্যাটফর্ম (বিডিং) 6432849193975106527
ক্রসচ্যানেল (MdotM) 9372067028804390441
কাস্টম ইভেন্ট 18351550913290782395
ডিটি এক্সচেঞ্জ*
* 21শে সেপ্টেম্বর, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফাইবার মার্কেটপ্লেস" বলা হত।
2179455223494392917
EMX (বিডিং) 8497809869790333482
ফ্লাক্ট (বিডিং) 8419777862490735710
ফ্লারি 3376427960656545613
ফাইবার*
* এই বিজ্ঞাপন উৎস ঐতিহাসিক রিপোর্টিং জন্য ব্যবহার করা হয়.
4839637394546996422
i-মোবাইল 5208827440166355534
ডিজিটাল উন্নত করুন (বিডিং) 159382223051638006
ইনডেক্স এক্সচেঞ্জ (বিডিং) 4100650709078789802
InMobi 7681903010231960328
InMobi (বিডিং) 6325663098072678541
ইনমোবি এক্সচেঞ্জ (বিডিং) 5264320421916134407
আয়রনসোর্স 6925240245545091930
আয়রনসোর্স বিজ্ঞাপন (বিডিং) 1643326773739866623
লিডবোল্ট 2899150749497968595
LG U+AD 18298738678491729107
লাইন বিজ্ঞাপন নেটওয়ার্ক 3025503711505004547
মায়ো 7505118203095108657
মায়ো (বিডিং) 1343336733822567166
Media.net (বিডিং) 2127936450554446159
মধ্যস্থতা হাউস বিজ্ঞাপন 6060308706800320801
মেটা অডিয়েন্স নেটওয়ার্ক*
* 6 জুন, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফেসবুক অডিয়েন্স নেটওয়ার্ক" বলা হত।
10568273599589928883
মেটা অডিয়েন্স নেটওয়ার্ক (বিডিং)*
* 6 জুন, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফেসবুক অডিয়েন্স নেটওয়ার্ক (বিডিং)" বলা হত।
11198165126854996598
মিন্টেগ্রাল 1357746574408896200
মিন্টেগ্রাল (বিডিং) 6250601289653372374
MobFox 8079529624516381459
MobFox (বিডিং) 3086513548163922365
MoPub ( অপ্রচলিত ) 10872986198578383917
আমার টার্গেট 8450873672465271579
নেন্ড 9383070032774777750
নেক্সেন (বিডিং)*

* 1 মে, 2024 এর আগে, এই নেটওয়ার্কটিকে "UnrulyX" বলা হত।

2831998725945605450
AOL দ্বারা ONE (সহস্রাব্দ মিডিয়া) 6101072188699264581
AOL দ্বারা ONE (Nexage) 3224789793037044399
OneTag Exchange (বিডিং) 4873891452523427499
OpenX (বিডিং) 4918705482605678398
প্যাঙ্গেল 4069896914521993236
প্যাঙ্গেল (বিডিং) 3525379893916449117
পাবম্যাটিক (বিডিং) 3841544486172445473
সংরক্ষণ অভিযান 7068401028668408324
RhythmOne (বিডিং) 2831998725945605450
রুবিকন (বিডিং) 3993193775968767067
এসকে গ্রহ 734341340207269415
শেয়ারথ্রু (বিডিং) 5247944089976324188
Smaato (নিলাম) 3362360112145450544
সমতুল্য (বিডিং)*

* 12 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "স্মার্ট অ্যাডসার্ভার" বলা হত।

5970199210771591442
সোনোবি (নিলাম) 3270984106996027150
ট্যাপজয় 7295217276740746030
ট্যাপজয় (নিলাম) 4692500501762622178
টেনসেন্ট জিডিটি 7007906637038700218
ট্রিপললিফ্ট (বিডিং) 8332676245392738510
ইউনিটি বিজ্ঞাপন 4970775877303683148
ইউনিটি বিজ্ঞাপন (বিডিং) 7069338991535737586
ভেরিজন মিডিয়া 7360851262951344112
ভার্ভ গ্রুপ (বিডিং) 5013176581647059185
Vpon 1940957084538325905
লিফটঅফ নগদীকরণ*

* 30 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "ভাংগল" বলা হত।

1953547073528090325
লিফটঅফ মনিটাইজ (বিডিং)*

* 30 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "ভাংলে (বিডিং)" বলা হত।

4692500501762622185
Yieldmo (বিডিং) 4193081836471107579
YieldOne (বিডিং) 3154533971590234104
জুক্স 5506531810221735863

ব্যবহারকারীকে পুরস্কৃত করা

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

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

কাস্টম ডেটা

যে অ্যাপগুলির সার্ভার-সাইড যাচাইকরণ কলব্যাকে অতিরিক্ত ডেটার প্রয়োজন হয় তাদের পুরস্কৃত বিজ্ঞাপনগুলির কাস্টম ডেটা বৈশিষ্ট্য ব্যবহার করা উচিত। পুরস্কৃত বিজ্ঞাপন অবজেক্টে সেট করা যেকোনো স্ট্রিং মান SSV কলব্যাকের custom_data ক্যোয়ারী প্যারামিটারে পাস করা হয়। যদি কোনো কাস্টম ডেটা মান সেট করা না থাকে, custom_data ক্যোয়ারী প্যারামিটার মান SSV কলব্যাকে উপস্থিত থাকবে না।

নিচের কোড নমুনাটি দেখায় যে কিভাবে একটি বিজ্ঞাপনের অনুরোধ করার আগে একটি পুরস্কৃত বিজ্ঞাপন বস্তুতে কাস্টম ডেটা সেট করতে হয়।

  firebase::gma::RewardedAd* rewarded_ad;
  rewarded_ad = new firebase::gma::RewardedAd();

  firebase::gma::RewardedAd::ServerSideVerificationOptions options;
  options.custom_data = "SAMPLE_CUSTOM_DATA_STRING";
  rewarded_ad->SetServerSideVerificationOptions(options);

আপনি যদি কাস্টম পুরষ্কার স্ট্রিং সেট করতে চান তবে আপনাকে বিজ্ঞাপন দেখানোর আগে তা করতে হবে।

পুরস্কৃত SSV-এর ম্যানুয়াল যাচাইকরণ

একটি পুরস্কৃত SSV যাচাই করার জন্য RewardedAdsVerifier ক্লাস দ্বারা সম্পাদিত পদক্ষেপগুলি নীচে বর্ণিত হয়েছে৷ যদিও অন্তর্ভুক্ত কোড স্নিপেটগুলি জাভাতে রয়েছে এবং Tink থার্ড-পার্টি লাইব্রেরি ব্যবহার করে, এই পদক্ষেপগুলি আপনার দ্বারা আপনার পছন্দের ভাষায় প্রয়োগ করা যেতে পারে, ECDSA সমর্থন করে এমন কোনও তৃতীয়-পক্ষের লাইব্রেরি ব্যবহার করে।

সর্বজনীন কীগুলি আনুন৷

একটি পুরস্কৃত SSV কলব্যাক যাচাই করতে, আপনার AdMob দ্বারা সরবরাহ করা একটি সর্বজনীন কী প্রয়োজন৷

পুরস্কৃত SSV কলব্যাকগুলি যাচাই করতে ব্যবহার করা সর্বজনীন কীগুলির একটি তালিকা AdMob কী সার্ভার থেকে আনা যেতে পারে৷ সর্বজনীন কীগুলির তালিকা নিম্নলিখিতগুলির মতো একটি বিন্যাস সহ JSON উপস্থাপনা হিসাবে সরবরাহ করা হয়েছে:

{
 "keys": [
    {
      keyId: 1916455855,
      pem: "-----BEGIN PUBLIC KEY-----\nMF...YTPcw==\n-----END PUBLIC KEY-----"
      base64: "MFkwEwYHKoZIzj0CAQYI...ltS4nzc9yjmhgVQOlmSS6unqvN9t8sqajRTPcw=="
    },
    {
      keyId: 3901585526,
      pem: "-----BEGIN PUBLIC KEY-----\nMF...aDUsw==\n-----END PUBLIC KEY-----"
      base64: "MFYwEAYHKoZIzj0CAQYF...4akdWbWDCUrMMGIV27/3/e7UuKSEonjGvaDUsw=="
    },
  ],
}

সর্বজনীন কীগুলি পুনরুদ্ধার করতে, AdMob কী সার্ভারের সাথে সংযোগ করুন এবং কীগুলি ডাউনলোড করুন৷ নিম্নলিখিত কোডটি এই কাজটি সম্পন্ন করে এবং data ভেরিয়েবলের কীগুলির JSON উপস্থাপনা সংরক্ষণ করে।

String url = ...;
NetHttpTransport httpTransport = new NetHttpTransport.Builder().build();
HttpRequest httpRequest =
    httpTransport.createRequestFactory().buildGetRequest(new GenericUrl(url));
HttpResponse httpResponse = httpRequest.execute();
if (httpResponse.getStatusCode() != HttpStatusCodes.STATUS_CODE_OK) {
  throw new IOException("Unexpected status code = " + httpResponse.getStatusCode());
}
String data;
InputStream contentStream = httpResponse.getContent();
try {
  InputStreamReader reader = new InputStreamReader(contentStream, UTF_8);
  data = readerToString(reader);
} finally {
  contentStream.close();
}

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

একবার সর্বজনীন কীগুলি আনা হয়ে গেলে, সেগুলি অবশ্যই পার্স করা উচিত৷ নীচের parsePublicKeysJson পদ্ধতিটি একটি JSON স্ট্রিং নেয়, যেমন উপরের উদাহরণ, ইনপুট হিসাবে, এবং key_id মান থেকে পাবলিক কীগুলিতে একটি ম্যাপিং তৈরি করে, যেগুলি Tink লাইব্রেরি থেকে ECPublicKey অবজেক্ট হিসাবে এনক্যাপসুলেট করা হয়।

private static Map<Integer, ECPublicKey> parsePublicKeysJson(String publicKeysJson)
    throws GeneralSecurityException {
  Map<Integer, ECPublicKey> publicKeys = new HashMap<>();
  try {
    JSONArray keys = new JSONObject(publicKeysJson).getJSONArray("keys");
    for (int i = 0; i < keys.length(); i++) {
      JSONObject key = keys.getJSONObject(i);
      publicKeys.put(
          key.getInt("keyId"),
          EllipticCurves.getEcPublicKey(Base64.decode(key.getString("base64"))));
    }
  } catch (JSONException e) {
    throw new GeneralSecurityException("failed to extract trusted signing public keys", e);
  }
  if (publicKeys.isEmpty()) {
    throw new GeneralSecurityException("No trusted keys are available.");
  }
  return publicKeys;
}

যাচাই করার জন্য সামগ্রী পান

পুরস্কৃত SSV কলব্যাকের শেষ দুটি ক্যোয়ারী প্যারামিটার সর্বদা signature এবং key_id, সেই ক্রমে। অবশিষ্ট ক্যোয়ারী পরামিতিগুলি যাচাই করা বিষয়বস্তু নির্দিষ্ট করে৷ ধরুন আপনি https://www.myserver.com/mypath এ পুরস্কার কলব্যাক পাঠাতে AdMob কনফিগার করেছেন। নীচের স্নিপেটটি হাইলাইট করা যাচাই করা বিষয়বস্তুর সাথে পুরস্কৃত SSV কলব্যাকের একটি উদাহরণ দেখায়।

https://www.myserver.com/path?ad_network=54...55&ad_unit=12345678&reward_amount=10&reward_item=coins
&timestamp=150777823&transaction_id=12...DEF&user_id=1234567&signature=ME...Z1c&key_id=1268887

একটি UTF-8 বাইট অ্যারে হিসাবে একটি কলব্যাক URL থেকে যাচাই করার জন্য সামগ্রীকে কীভাবে পার্স করতে হয় তা নীচের কোডটি প্রদর্শন করে৷

public static final String SIGNATURE_PARAM_NAME = "signature=";
...
URI uri;
try {
  uri = new URI(rewardUrl);
} catch (URISyntaxException ex) {
  throw new GeneralSecurityException(ex);
}
String queryString = uri.getQuery();
int i = queryString.indexOf(SIGNATURE_PARAM_NAME);
if (i == -1) {
  throw new GeneralSecurityException("needs a signature query parameter");
}
byte[] queryParamContentData =
    queryString
        .substring(0, i - 1)
        // i - 1 instead of i because of & in the query string
        .getBytes(Charset.forName("UTF-8"));

কলব্যাক URL থেকে স্বাক্ষর এবং key_id পান

পূর্ববর্তী ধাপ থেকে queryString মান ব্যবহার করে, নীচে দেখানো হিসাবে কলব্যাক URL থেকে signature এবং key_id ক্যোয়ারী প্যারামিটার পার্স করুন:

public static final String KEY_ID_PARAM_NAME = "key_id=";
...
String sigAndKeyId = queryString.substring(i);
i = sigAndKeyId.indexOf(KEY_ID_PARAM_NAME);
if (i == -1) {
  throw new GeneralSecurityException("needs a key_id query parameter");
}
String sig =
    sigAndKeyId.substring(
        SIGNATURE_PARAM_NAME.length(), i - 1 /* i - 1 instead of i because of & */);
int keyId = Integer.valueOf(sigAndKeyId.substring(i + KEY_ID_PARAM_NAME.length()));

যাচাইকরণ সঞ্চালন

চূড়ান্ত পদক্ষেপ হল উপযুক্ত সর্বজনীন কী দিয়ে কলব্যাক URL-এর বিষয়বস্তু যাচাই করা। parsePublicKeysJson পদ্ধতি থেকে ফেরত ম্যাপিং নিন এবং সেই ম্যাপিং থেকে সর্বজনীন কী পেতে কলব্যাক URL থেকে key_id প্যারামিটার ব্যবহার করুন। তারপর সেই পাবলিক কী দিয়ে স্বাক্ষর যাচাই করুন। এই পদক্ষেপগুলি verify পদ্ধতিতে নীচে প্রদর্শিত হয়েছে।

private void verify(final byte[] dataToVerify, int keyId, final byte[] signature)
    throws GeneralSecurityException {
  Map<Integer, ECPublicKey> publicKeys = parsePublicKeysJson();
  if (publicKeys.containsKey(keyId)) {
    foundKeyId = true;
    ECPublicKey publicKey = publicKeys.get(keyId);
    EcdsaVerifyJce verifier = new EcdsaVerifyJce(publicKey, HashType.SHA256, EcdsaEncoding.DER);
    verifier.verify(signature, dataToVerify);
  } else {
    throw new GeneralSecurityException("cannot find verifying key with key ID: " + keyId);
  }
}

যদি পদ্ধতিটি কোনো ব্যতিক্রম ছাড়াই কার্যকর হয়, তাহলে কলব্যাক URL সফলভাবে যাচাই করা হয়েছে।

FAQ

আমি কি AdMob কী সার্ভারের দেওয়া সর্বজনীন কী ক্যাশে করতে পারি?
আমরা সুপারিশ করি যে আপনি SSV কলব্যাকগুলিকে যাচাই করার জন্য প্রয়োজনীয় ক্রিয়াকলাপগুলির সংখ্যা কমাতে AdMob কী সার্ভার দ্বারা সরবরাহিত সর্বজনীন কীটি ক্যাশে করুন৷ যাইহোক, মনে রাখবেন যে সর্বজনীন কীগুলি নিয়মিত ঘোরানো হয় এবং 24 ঘন্টার বেশি সময় ধরে ক্যাশে করা উচিত নয়৷
AdMob কী সার্ভার দ্বারা সরবরাহ করা সর্বজনীন কীগুলি কত ঘন ঘন ঘোরানো হয়?
AdMob কী সার্ভার দ্বারা প্রদত্ত সর্বজনীন কীগুলি পরিবর্তনশীল সময়সূচীতে ঘোরানো হয়। নিশ্চিত করতে যে SSV কলব্যাকগুলির যাচাইকরণ উদ্দেশ্য অনুযায়ী কাজ করে চলেছে, সর্বজনীন কীগুলি 24 ঘন্টার বেশি ক্যাশে করা উচিত নয়৷
আমার সার্ভারে পৌঁছাতে না পারলে কী হবে?
Google SSV কলব্যাকের জন্য একটি HTTP 200 OK সাফল্যের স্থিতি প্রতিক্রিয়া কোড আশা করে৷ যদি আপনার সার্ভারে পৌঁছানো না যায় বা প্রত্যাশিত প্রতিক্রিয়া প্রদান না করে, Google এক-সেকেন্ডের ব্যবধানে পাঁচ বার পর্যন্ত SSV কলব্যাক পাঠানোর পুনরায় চেষ্টা করবে।
আমি কিভাবে যাচাই করতে পারি যে SSV কলব্যাকগুলি Google থেকে আসছে?
SSV কলব্যাকগুলি Google থেকে এসেছে তা যাচাই করতে বিপরীত DNS লুকআপ ব্যবহার করুন৷
,


সার্ভার-সাইড ভেরিফিকেশন কলব্যাক হল URL অনুরোধ, Google দ্বারা প্রসারিত ক্যোয়ারী প্যারামিটার সহ, যেগুলি Google দ্বারা একটি বহিরাগত সিস্টেমে পাঠানো হয় যাতে এটি জানানো হয় যে একজন ব্যবহারকারীকে পুরস্কৃত বা পুরস্কৃত ইন্টারস্টিশিয়াল বিজ্ঞাপনের সাথে ইন্টারঅ্যাক্ট করার জন্য পুরস্কৃত করা উচিত। পুরস্কৃত SSV (সার্ভার-সাইড যাচাইকরণ) কলব্যাকগুলি ব্যবহারকারীদের পুরস্কৃত করার জন্য ক্লায়েন্ট-সাইড কলব্যাকগুলির স্পুফিংয়ের বিরুদ্ধে সুরক্ষার একটি অতিরিক্ত স্তর সরবরাহ করে৷

এই নির্দেশিকাটি আপনাকে দেখায় কিভাবে Tink Java Apps থার্ড-পার্টি ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করে পুরস্কৃত SSV কলব্যাকগুলি যাচাই করতে হয় যাতে কলব্যাকের ক্যোয়ারী প্যারামিটারগুলি বৈধ মান। যদিও এই গাইডের উদ্দেশ্যে Tink ব্যবহার করা হয়, আপনার কাছে ECDSA সমর্থন করে এমন কোনো তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করার বিকল্প আছে। এছাড়াও আপনি AdMob UI-তে টেস্টিং টুল দিয়ে আপনার সার্ভার পরীক্ষা করতে পারেন।

জাভা স্প্রিং-বুট ব্যবহার করে এই সম্পূর্ণ কার্যকরী উদাহরণটি দেখুন।

পূর্বশর্ত

Tink Java Apps লাইব্রেরি থেকে RewardedAdsVerifier ব্যবহার করুন

Tink Java Apps GitHub সংগ্রহস্থলে একটি পুরস্কৃত SSV কলব্যাক যাচাই করার জন্য প্রয়োজনীয় কোড কমাতে একটি RewardedAdsVerifier সহায়ক শ্রেণী অন্তর্ভুক্ত রয়েছে। এই ক্লাসটি ব্যবহার করে আপনি নিম্নলিখিত কোড সহ একটি কলব্যাক URL যাচাই করতে পারবেন৷

RewardedAdsVerifier verifier = new RewardedAdsVerifier.Builder()
    .fetchVerifyingPublicKeysWith(
        RewardedAdsVerifier.KEYS_DOWNLOADER_INSTANCE_PROD)
    .build();
String rewardUrl = ...;
verifier.verify(rewardUrl);

যদি verify() পদ্ধতিটি কোনো ব্যতিক্রম ছাড়াই কার্যকর হয়, তাহলে কলব্যাক URL সফলভাবে যাচাই করা হয়েছে। ব্যবহারকারীদের কখন পুরস্কৃত করা উচিত সে সম্পর্কিত সেরা অনুশীলনের বিবরণ ব্যবহারকারী বিভাগে পুরস্কৃত করা হয়েছে । পুরস্কৃত SSV কলব্যাক যাচাই করার জন্য এই শ্রেণীর দ্বারা সম্পাদিত পদক্ষেপগুলির একটি ব্রেকডাউনের জন্য, আপনি পুরস্কৃত SSV বিভাগের ম্যানুয়াল যাচাইকরণের মাধ্যমে পড়তে পারেন।

SSV কলব্যাক পরামিতি

সার্ভার-সাইড যাচাইকরণ কলব্যাকগুলিতে ক্যোয়ারী প্যারামিটার থাকে যা পুরস্কৃত বিজ্ঞাপন ইন্টারঅ্যাকশন বর্ণনা করে। প্যারামিটারের নাম, বর্ণনা এবং উদাহরণের মান নীচে তালিকাভুক্ত করা হয়েছে। পরামিতিগুলি বর্ণানুক্রমিকভাবে পাঠানো হয়।

প্যারামিটারের নাম বর্ণনা উদাহরণ মান
ad_network যে বিজ্ঞাপনটি এই বিজ্ঞাপনটি পূরণ করেছে সেই বিজ্ঞাপন উৎসের জন্য বিজ্ঞাপন উৎস শনাক্তকারী। আইডি মানগুলির সাথে সম্পর্কিত বিজ্ঞাপন উত্সের নামগুলি বিজ্ঞাপন উত্স সনাক্তকারী বিভাগে তালিকাভুক্ত করা হয়েছে৷ 1953547073528090325
বিজ্ঞাপন_ইউনিট AdMob বিজ্ঞাপন ইউনিট আইডি যা পুরস্কৃত বিজ্ঞাপনের অনুরোধ করতে ব্যবহৃত হয়েছিল। 2747237135
কাস্টম_ডেটা দ্বারা প্রদত্ত কাস্টম ডেটা স্ট্রিং ServerSideVerificationOptions::custom_data .

যদি অ্যাপ দ্বারা কোনো কাস্টম ডেটা স্ট্রিং প্রদান না করা হয়, তাহলে এই ক্যোয়ারী প্যারামিটার মান SSV কলব্যাকে উপস্থিত থাকবে না।

SAMPLE_CUSTOM_DATA_STRING
key_id SSV কলব্যাক যাচাই করতে ব্যবহার করা কী। এই মানটি AdMob কী সার্ভার দ্বারা প্রদত্ত একটি সর্বজনীন কী-তে মানচিত্র করে। 1234567890
পুরস্কার_অর্থ বিজ্ঞাপন ইউনিট সেটিংসে উল্লেখ করা পুরস্কারের পরিমাণ। 5
reward_item বিজ্ঞাপন ইউনিট সেটিংসে উল্লেখ করা পুরস্কার আইটেম। মুদ্রা
স্বাক্ষর AdMob দ্বারা জেনারেট করা SSV কলব্যাকের জন্য স্বাক্ষর৷ MEUCIQCLJS_s4ia_sN06HqzeW7Wc3nhZi4RlW3qV0oO-6AIYdQIgGJEh-rzKreO-paNDbSCzWGMtmgJHYYW9k2_icM9LFMY
টাইমস্ট্যাম্প যখন ব্যবহারকারীকে ms-এ Epoch time হিসাবে পুরস্কৃত করা হয়েছিল তার টাইমস্ট্যাম্প৷ 1507770365237823
লেনদেন_আইডি AdMob দ্বারা জেনারেট করা প্রতিটি পুরস্কার অনুদান ইভেন্টের জন্য অনন্য হেক্স এনকোড করা শনাক্তকারী। 18fa792de1bca816048293fc71035638
user_id ব্যবহারকারী শনাক্তকারী হিসাবে প্রদান করা হয়েছেServerSideVerificationOptions::user_id

অ্যাপ দ্বারা কোনো ব্যবহারকারী শনাক্তকারী প্রদান করা না হলে, এই ক্যোয়ারী প্যারামিটারটি SSV কলব্যাকে উপস্থিত থাকবে না।

1234567

বিজ্ঞাপন উৎস শনাক্তকারী

বিজ্ঞাপন উৎসের নাম এবং আইডি

বিজ্ঞাপন উৎসের নাম বিজ্ঞাপন উৎস আইডি
আরকি (দরপত্র) 5240798063227064260
বিজ্ঞাপন প্রজন্ম (বিডিং) 1477265452970951479
অ্যাডকলোনি 15586990674969969776
অ্যাডকলোনি (এসডিকে নয়) (বিডিং) 4600416542059544716
অ্যাডকলোনি (বিডিং) 6895345910719072481
অ্যাডফ্যালকন 3528208921554210682
AdMob নেটওয়ার্ক 5450213213286189855
AdMob নেটওয়ার্ক জলপ্রপাত 1215381445328257950
ADR ফলাফল 10593873382626181482
AMoAd 17253994435944008978
অ্যাপলোভিন 1063618907739174004
অ্যাপলোভিন (নিলাম) 1328079684332308356
চার্টবুস্ট 2873236629771172317
চকোলেট প্ল্যাটফর্ম (বিডিং) 6432849193975106527
ক্রসচ্যানেল (MdotM) 9372067028804390441
কাস্টম ইভেন্ট 18351550913290782395
ডিটি এক্সচেঞ্জ*
* 21শে সেপ্টেম্বর, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফাইবার মার্কেটপ্লেস" বলা হত।
2179455223494392917
EMX (বিডিং) 8497809869790333482
ফ্লাক্ট (বিডিং) 8419777862490735710
ফ্লারি 3376427960656545613
ফাইবার*
* এই বিজ্ঞাপন উৎস ঐতিহাসিক রিপোর্টিং জন্য ব্যবহার করা হয়.
4839637394546996422
i-মোবাইল 5208827440166355534
ডিজিটাল উন্নত করুন (বিডিং) 159382223051638006
ইনডেক্স এক্সচেঞ্জ (বিডিং) 4100650709078789802
InMobi 7681903010231960328
InMobi (বিডিং) 6325663098072678541
ইনমোবি এক্সচেঞ্জ (বিডিং) 5264320421916134407
আয়রনসোর্স 6925240245545091930
আয়রনসোর্স বিজ্ঞাপন (বিডিং) 1643326773739866623
লিডবোল্ট 2899150749497968595
LG U+AD 18298738678491729107
লাইন বিজ্ঞাপন নেটওয়ার্ক 3025503711505004547
মায়ো 7505118203095108657
মায়ো (বিডিং) 1343336733822567166
Media.net (বিডিং) 2127936450554446159
মধ্যস্থতা হাউস বিজ্ঞাপন 6060308706800320801
মেটা অডিয়েন্স নেটওয়ার্ক*
* 6 জুন, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফেসবুক অডিয়েন্স নেটওয়ার্ক" বলা হত।
10568273599589928883
মেটা অডিয়েন্স নেটওয়ার্ক (বিডিং)*
* 6 জুন, 2022 এর আগে, এই নেটওয়ার্কটিকে "ফেসবুক অডিয়েন্স নেটওয়ার্ক (বিডিং)" বলা হত।
11198165126854996598
মিন্টেগ্রাল 1357746574408896200
মিন্টেগ্রাল (বিডিং) 6250601289653372374
MobFox 8079529624516381459
MobFox (বিডিং) 3086513548163922365
MoPub ( অপ্রচলিত ) 10872986198578383917
আমার টার্গেট 8450873672465271579
নেন্ড 9383070032774777750
নেক্সেন (বিডিং)*

* 1 মে, 2024 এর আগে, এই নেটওয়ার্কটিকে "UnrulyX" বলা হত।

2831998725945605450
AOL দ্বারা ONE (সহস্রাব্দ মিডিয়া) 6101072188699264581
AOL দ্বারা ONE (Nexage) 3224789793037044399
OneTag Exchange (বিডিং) 4873891452523427499
OpenX (বিডিং) 4918705482605678398
প্যাঙ্গেল 4069896914521993236
প্যাঙ্গেল (বিডিং) 3525379893916449117
পাবম্যাটিক (বিডিং) 3841544486172445473
সংরক্ষণ অভিযান 7068401028668408324
RhythmOne (বিডিং) 2831998725945605450
রুবিকন (বিডিং) 3993193775968767067
এসকে গ্রহ 734341340207269415
শেয়ারথ্রু (বিডিং) 5247944089976324188
Smaato (নিলাম) 3362360112145450544
সমতুল্য (বিডিং)*

* 12 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "স্মার্ট অ্যাডসার্ভার" বলা হত।

5970199210771591442
সোনোবি (নিলাম) 3270984106996027150
ট্যাপজয় 7295217276740746030
ট্যাপজয় (নিলাম) 4692500501762622178
টেনসেন্ট জিডিটি 7007906637038700218
ট্রিপললিফ্ট (বিডিং) 8332676245392738510
ইউনিটি বিজ্ঞাপন 4970775877303683148
ইউনিটি বিজ্ঞাপন (বিডিং) 7069338991535737586
ভেরিজন মিডিয়া 7360851262951344112
ভার্ভ গ্রুপ (বিডিং) 5013176581647059185
Vpon 1940957084538325905
লিফটঅফ নগদীকরণ*

* 30 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "ভাংগল" বলা হত।

1953547073528090325
লিফটঅফ মনিটাইজ (বিডিং)*

* 30 জানুয়ারী, 2023 এর আগে, এই নেটওয়ার্কটিকে "ভাংলে (বিডিং)" বলা হত।

4692500501762622185
Yieldmo (বিডিং) 4193081836471107579
YieldOne (বিডিং) 3154533971590234104
জুক্স 5506531810221735863

ব্যবহারকারীকে পুরস্কৃত করা

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

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

কাস্টম ডেটা

যে অ্যাপগুলির সার্ভার-সাইড যাচাইকরণ কলব্যাকে অতিরিক্ত ডেটার প্রয়োজন হয় তাদের পুরস্কৃত বিজ্ঞাপনগুলির কাস্টম ডেটা বৈশিষ্ট্য ব্যবহার করা উচিত। পুরস্কৃত বিজ্ঞাপন অবজেক্টে সেট করা যেকোনো স্ট্রিং মান SSV কলব্যাকের custom_data ক্যোয়ারী প্যারামিটারে পাস করা হয়। যদি কোনো কাস্টম ডেটা মান সেট করা না থাকে, custom_data ক্যোয়ারী প্যারামিটার মান SSV কলব্যাকে উপস্থিত থাকবে না।

নিচের কোড নমুনাটি দেখায় যে কিভাবে একটি বিজ্ঞাপনের অনুরোধ করার আগে একটি পুরস্কৃত বিজ্ঞাপন বস্তুতে কাস্টম ডেটা সেট করতে হয়।

  firebase::gma::RewardedAd* rewarded_ad;
  rewarded_ad = new firebase::gma::RewardedAd();

  firebase::gma::RewardedAd::ServerSideVerificationOptions options;
  options.custom_data = "SAMPLE_CUSTOM_DATA_STRING";
  rewarded_ad->SetServerSideVerificationOptions(options);

আপনি যদি কাস্টম পুরষ্কার স্ট্রিং সেট করতে চান তবে আপনাকে বিজ্ঞাপন দেখানোর আগে তা করতে হবে।

পুরস্কৃত SSV-এর ম্যানুয়াল যাচাইকরণ

একটি পুরস্কৃত SSV যাচাই করার জন্য RewardedAdsVerifier ক্লাস দ্বারা সম্পাদিত পদক্ষেপগুলি নীচে বর্ণিত হয়েছে৷ যদিও অন্তর্ভুক্ত কোড স্নিপেটগুলি জাভাতে রয়েছে এবং Tink থার্ড-পার্টি লাইব্রেরি ব্যবহার করে, এই পদক্ষেপগুলি আপনার দ্বারা আপনার পছন্দের ভাষায় প্রয়োগ করা যেতে পারে, ECDSA সমর্থন করে এমন কোনও তৃতীয়-পক্ষের লাইব্রেরি ব্যবহার করে।

সর্বজনীন কীগুলি আনুন৷

একটি পুরস্কৃত SSV কলব্যাক যাচাই করতে, আপনার AdMob দ্বারা সরবরাহ করা একটি সর্বজনীন কী প্রয়োজন৷

পুরস্কৃত SSV কলব্যাকগুলি যাচাই করতে ব্যবহার করা সর্বজনীন কীগুলির একটি তালিকা AdMob কী সার্ভার থেকে আনা যেতে পারে৷ সর্বজনীন কীগুলির তালিকা নিম্নলিখিতগুলির মতো একটি বিন্যাস সহ JSON উপস্থাপনা হিসাবে সরবরাহ করা হয়েছে:

{
 "keys": [
    {
      keyId: 1916455855,
      pem: "-----BEGIN PUBLIC KEY-----\nMF...YTPcw==\n-----END PUBLIC KEY-----"
      base64: "MFkwEwYHKoZIzj0CAQYI...ltS4nzc9yjmhgVQOlmSS6unqvN9t8sqajRTPcw=="
    },
    {
      keyId: 3901585526,
      pem: "-----BEGIN PUBLIC KEY-----\nMF...aDUsw==\n-----END PUBLIC KEY-----"
      base64: "MFYwEAYHKoZIzj0CAQYF...4akdWbWDCUrMMGIV27/3/e7UuKSEonjGvaDUsw=="
    },
  ],
}

সর্বজনীন কীগুলি পুনরুদ্ধার করতে, AdMob কী সার্ভারের সাথে সংযোগ করুন এবং কীগুলি ডাউনলোড করুন৷ নিম্নলিখিত কোডটি এই কাজটি সম্পন্ন করে এবং data ভেরিয়েবলের কীগুলির JSON উপস্থাপনা সংরক্ষণ করে।

String url = ...;
NetHttpTransport httpTransport = new NetHttpTransport.Builder().build();
HttpRequest httpRequest =
    httpTransport.createRequestFactory().buildGetRequest(new GenericUrl(url));
HttpResponse httpResponse = httpRequest.execute();
if (httpResponse.getStatusCode() != HttpStatusCodes.STATUS_CODE_OK) {
  throw new IOException("Unexpected status code = " + httpResponse.getStatusCode());
}
String data;
InputStream contentStream = httpResponse.getContent();
try {
  InputStreamReader reader = new InputStreamReader(contentStream, UTF_8);
  data = readerToString(reader);
} finally {
  contentStream.close();
}

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

একবার সর্বজনীন কীগুলি আনা হয়ে গেলে, সেগুলি অবশ্যই পার্স করা উচিত৷ নীচের parsePublicKeysJson পদ্ধতিটি একটি JSON স্ট্রিং নেয়, যেমন উপরের উদাহরণ, ইনপুট হিসাবে, এবং key_id মান থেকে পাবলিক কীগুলিতে একটি ম্যাপিং তৈরি করে, যেগুলি Tink লাইব্রেরি থেকে ECPublicKey অবজেক্ট হিসাবে এনক্যাপসুলেট করা হয়।

private static Map<Integer, ECPublicKey> parsePublicKeysJson(String publicKeysJson)
    throws GeneralSecurityException {
  Map<Integer, ECPublicKey> publicKeys = new HashMap<>();
  try {
    JSONArray keys = new JSONObject(publicKeysJson).getJSONArray("keys");
    for (int i = 0; i < keys.length(); i++) {
      JSONObject key = keys.getJSONObject(i);
      publicKeys.put(
          key.getInt("keyId"),
          EllipticCurves.getEcPublicKey(Base64.decode(key.getString("base64"))));
    }
  } catch (JSONException e) {
    throw new GeneralSecurityException("failed to extract trusted signing public keys", e);
  }
  if (publicKeys.isEmpty()) {
    throw new GeneralSecurityException("No trusted keys are available.");
  }
  return publicKeys;
}

যাচাই করার জন্য সামগ্রী পান

পুরস্কৃত SSV কলব্যাকের শেষ দুটি ক্যোয়ারী প্যারামিটার সর্বদা signature এবং key_id, সেই ক্রমে। অবশিষ্ট ক্যোয়ারী পরামিতিগুলি যাচাই করা বিষয়বস্তু নির্দিষ্ট করে৷ ধরুন আপনি https://www.myserver.com/mypath এ পুরস্কার কলব্যাক পাঠাতে AdMob কনফিগার করেছেন। নীচের স্নিপেটটি হাইলাইট করা যাচাই করা বিষয়বস্তুর সাথে পুরস্কৃত SSV কলব্যাকের একটি উদাহরণ দেখায়।

https://www.myserver.com/path?ad_network=54...55&ad_unit=12345678&reward_amount=10&reward_item=coins
&timestamp=150777823&transaction_id=12...DEF&user_id=1234567&signature=ME...Z1c&key_id=1268887

একটি UTF-8 বাইট অ্যারে হিসাবে একটি কলব্যাক URL থেকে যাচাই করার জন্য সামগ্রীকে কীভাবে পার্স করতে হয় তা নীচের কোডটি প্রদর্শন করে৷

public static final String SIGNATURE_PARAM_NAME = "signature=";
...
URI uri;
try {
  uri = new URI(rewardUrl);
} catch (URISyntaxException ex) {
  throw new GeneralSecurityException(ex);
}
String queryString = uri.getQuery();
int i = queryString.indexOf(SIGNATURE_PARAM_NAME);
if (i == -1) {
  throw new GeneralSecurityException("needs a signature query parameter");
}
byte[] queryParamContentData =
    queryString
        .substring(0, i - 1)
        // i - 1 instead of i because of & in the query string
        .getBytes(Charset.forName("UTF-8"));

কলব্যাক URL থেকে স্বাক্ষর এবং key_id পান

পূর্ববর্তী ধাপ থেকে queryString মান ব্যবহার করে, নীচে দেখানো হিসাবে কলব্যাক URL থেকে signature এবং key_id ক্যোয়ারী প্যারামিটার পার্স করুন:

public static final String KEY_ID_PARAM_NAME = "key_id=";
...
String sigAndKeyId = queryString.substring(i);
i = sigAndKeyId.indexOf(KEY_ID_PARAM_NAME);
if (i == -1) {
  throw new GeneralSecurityException("needs a key_id query parameter");
}
String sig =
    sigAndKeyId.substring(
        SIGNATURE_PARAM_NAME.length(), i - 1 /* i - 1 instead of i because of & */);
int keyId = Integer.valueOf(sigAndKeyId.substring(i + KEY_ID_PARAM_NAME.length()));

যাচাইকরণ সঞ্চালন

চূড়ান্ত পদক্ষেপ হল উপযুক্ত সর্বজনীন কী দিয়ে কলব্যাক URL-এর বিষয়বস্তু যাচাই করা। parsePublicKeysJson পদ্ধতি থেকে ফেরত ম্যাপিং নিন এবং সেই ম্যাপিং থেকে সর্বজনীন কী পেতে কলব্যাক URL থেকে key_id প্যারামিটার ব্যবহার করুন। তারপর সেই পাবলিক কী দিয়ে স্বাক্ষর যাচাই করুন। এই পদক্ষেপগুলি verify পদ্ধতিতে নীচে প্রদর্শিত হয়েছে।

private void verify(final byte[] dataToVerify, int keyId, final byte[] signature)
    throws GeneralSecurityException {
  Map<Integer, ECPublicKey> publicKeys = parsePublicKeysJson();
  if (publicKeys.containsKey(keyId)) {
    foundKeyId = true;
    ECPublicKey publicKey = publicKeys.get(keyId);
    EcdsaVerifyJce verifier = new EcdsaVerifyJce(publicKey, HashType.SHA256, EcdsaEncoding.DER);
    verifier.verify(signature, dataToVerify);
  } else {
    throw new GeneralSecurityException("cannot find verifying key with key ID: " + keyId);
  }
}

যদি পদ্ধতিটি কোনো ব্যতিক্রম ছাড়াই কার্যকর হয়, তাহলে কলব্যাক URL সফলভাবে যাচাই করা হয়েছে।

FAQ

আমি কি AdMob কী সার্ভারের দেওয়া সর্বজনীন কী ক্যাশে করতে পারি?
আমরা সুপারিশ করি যে আপনি SSV কলব্যাকগুলিকে যাচাই করার জন্য প্রয়োজনীয় ক্রিয়াকলাপগুলির সংখ্যা কমাতে AdMob কী সার্ভার দ্বারা সরবরাহিত সর্বজনীন কীটি ক্যাশে করুন৷ যাইহোক, মনে রাখবেন যে সর্বজনীন কীগুলি নিয়মিত ঘোরানো হয় এবং 24 ঘন্টার বেশি সময় ধরে ক্যাশে করা উচিত নয়৷
AdMob কী সার্ভার দ্বারা সরবরাহ করা সর্বজনীন কীগুলি কত ঘন ঘন ঘোরানো হয়?
AdMob কী সার্ভার দ্বারা প্রদত্ত সর্বজনীন কীগুলি পরিবর্তনশীল সময়সূচীতে ঘোরানো হয়। নিশ্চিত করতে যে SSV কলব্যাকগুলির যাচাইকরণ উদ্দেশ্য অনুযায়ী কাজ করে চলেছে, সর্বজনীন কীগুলি 24 ঘন্টার বেশি ক্যাশে করা উচিত নয়৷
আমার সার্ভারে পৌঁছাতে না পারলে কী হবে?
Google SSV কলব্যাকের জন্য একটি HTTP 200 OK সাফল্যের স্থিতি প্রতিক্রিয়া কোড আশা করে৷ যদি আপনার সার্ভারে পৌঁছানো না যায় বা প্রত্যাশিত প্রতিক্রিয়া প্রদান না করে, Google এক-সেকেন্ডের ব্যবধানে পাঁচ বার পর্যন্ত SSV কলব্যাক পাঠানোর পুনরায় চেষ্টা করবে।
আমি কিভাবে যাচাই করতে পারি যে SSV কলব্যাকগুলি Google থেকে আসছে?
SSV কলব্যাকগুলি Google থেকে এসেছে তা যাচাই করতে বিপরীত DNS লুকআপ ব্যবহার করুন৷