সার্ভার-সাইড ভেরিফিকেশন কলব্যাক হল URL অনুরোধ, Google দ্বারা প্রসারিত ক্যোয়ারী প্যারামিটার সহ, যেগুলি Google দ্বারা একটি বহিরাগত সিস্টেমে পাঠানো হয় যাতে এটি জানানো হয় যে একজন ব্যবহারকারীকে পুরস্কৃত বা পুরস্কৃত ইন্টারস্টিশিয়াল বিজ্ঞাপনের সাথে ইন্টারঅ্যাক্ট করার জন্য পুরস্কৃত করা উচিত। পুরস্কৃত SSV (সার্ভার-সাইড যাচাইকরণ) কলব্যাকগুলি ব্যবহারকারীদের পুরস্কৃত করার জন্য ক্লায়েন্ট-সাইড কলব্যাকগুলির স্পুফিংয়ের বিরুদ্ধে সুরক্ষার একটি অতিরিক্ত স্তর সরবরাহ করে৷
এই নির্দেশিকাটি আপনাকে দেখায় কিভাবে Tink Java Apps থার্ড-পার্টি ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করে পুরস্কৃত SSV কলব্যাকগুলি যাচাই করতে হয় যাতে কলব্যাকের ক্যোয়ারী প্যারামিটারগুলি বৈধ মান। যদিও এই গাইডের উদ্দেশ্যে Tink ব্যবহার করা হয়, আপনার কাছে ECDSA সমর্থন করে এমন কোনো তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করার বিকল্প আছে। এছাড়াও আপনি AdMob UI-তে টেস্টিং টুল দিয়ে আপনার সার্ভার পরীক্ষা করতে পারেন।
জাভা স্প্রিং-বুট ব্যবহার করে এই সম্পূর্ণ কার্যকরী উদাহরণটি দেখুন।
পূর্বশর্ত
এর সাথে আপনার মোবাইল অ্যাপে পুরস্কৃত বিজ্ঞাপনগুলিকে একীভূত করুন৷v9.1.0 বা Google মোবাইল বিজ্ঞাপন SDK এর উচ্চতর।
আপনার বিজ্ঞাপন ইউনিটে পুরস্কৃত সার্ভার-সাইড যাচাইকরণ সক্ষম করুন।
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 ×tamp=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-তে টেস্টিং টুল দিয়ে আপনার সার্ভার পরীক্ষা করতে পারেন।
জাভা স্প্রিং-বুট ব্যবহার করে এই সম্পূর্ণ কার্যকরী উদাহরণটি দেখুন।
পূর্বশর্ত
এর সাথে আপনার মোবাইল অ্যাপে পুরস্কৃত বিজ্ঞাপনগুলিকে একীভূত করুন৷v9.1.0 বা Google মোবাইল বিজ্ঞাপন SDK এর উচ্চতর।
আপনার বিজ্ঞাপন ইউনিটে পুরস্কৃত সার্ভার-সাইড যাচাইকরণ সক্ষম করুন।
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 ×tamp=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-তে টেস্টিং টুল দিয়ে আপনার সার্ভার পরীক্ষা করতে পারেন।
জাভা স্প্রিং-বুট ব্যবহার করে এই সম্পূর্ণ কার্যকরী উদাহরণটি দেখুন।
পূর্বশর্ত
এর সাথে আপনার মোবাইল অ্যাপে পুরস্কৃত বিজ্ঞাপনগুলিকে একীভূত করুন৷v9.1.0 বা Google মোবাইল বিজ্ঞাপন SDK এর উচ্চতর।
আপনার বিজ্ঞাপন ইউনিটে পুরস্কৃত সার্ভার-সাইড যাচাইকরণ সক্ষম করুন।
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 ×tamp=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 লুকআপ ব্যবহার করুন৷