Sunucu tarafı doğrulama geri çağırmaları, Google tarafından genişletilmiş sorgu parametreleri içeren URL istekleridir. Google, bu istekleri harici bir sisteme göndererek kullanıcıya ödüllü veya ödüllü geçiş reklamıyla etkileşimde bulunduğu için ödül verilmesi gerektiğini bildirir. Ödüllü SSV (sunucu tarafı doğrulama) geri çağırmaları, kullanıcıları ödüllendirmek için istemci tarafı geri çağırmalarının sahteciliğine karşı ek bir koruma katmanı sağlar.
Bu kılavuzda, geri çağırmadaki sorgu parametrelerinin geçerli değerler olduğundan emin olmak için Tink Java Apps adlı üçüncü taraf kriptografik kitaplığı kullanarak ödüllü SSV geri çağırmalarının nasıl doğrulanacağı gösterilmektedir. Bu kılavuzda Tink kullanılsa da ECDSA'yı destekleyen herhangi bir üçüncü taraf kitaplığını kullanabilirsiniz. Ayrıca, AdMob kullanıcı arayüzündeki test aracını kullanarak da sunucunuzu test edebilirsiniz.
Ön koşullar
- Reklam biriminizde ödül için sunucu tarafı doğrulama'yı etkinleştirin.
Tink Java Apps kitaplığındaki RewardedAdsVerifier'ı kullanma
Tink Java Apps GitHub deposunda, ödüllü bir SSV geri aramasını doğrulamak için gereken kodu azaltan bir RewardedAdsVerifier
yardımcı sınıfı bulunur.
Bu sınıfı kullanarak aşağıdaki kodla bir geri çağırma URL'sini doğrulayabilirsiniz.
RewardedAdsVerifier verifier = new RewardedAdsVerifier.Builder()
.fetchVerifyingPublicKeysWith(
RewardedAdsVerifier.KEYS_DOWNLOADER_INSTANCE_PROD)
.build();
String rewardUrl = ...;
verifier.verify(rewardUrl);
verify()
yöntemi istisna oluşturmadan yürütülürse geri çağırma URL'si başarıyla doğrulanmıştır. Kullanıcıyı ödüllendirme bölümünde, kullanıcıların ne zaman ödüllendirilmesi gerektiğiyle ilgili en iyi uygulamalar ayrıntılı olarak açıklanmaktadır. Bu sınıfın ödüllü SSV geri çağırmalarını doğrulamak için gerçekleştirdiği adımların dökümü için Ödüllü SSV'nin manuel doğrulanması bölümünü inceleyebilirsiniz.
SSV geri çağırma parametreleri
Sunucu tarafı doğrulama geri çağırmaları, ödüllü reklam etkileşimini açıklayan sorgu parametreleri içerir. Parametre adları, açıklamaları ve örnek değerleri aşağıda listelenmiştir. Parametreler alfabetik sırayla gönderilir.
Parametre Adı | Açıklama | Örnek değer |
---|---|---|
ad_network | Bu reklamı karşılayan reklam kaynağının reklam kaynağı tanımlayıcısı. Kimlik değerlerine karşılık gelen reklam kaynağı adları, Reklam kaynağı tanımlayıcıları bölümünde listelenir. | 1953547073528090325 |
ad_unit | Ödüllü reklamı istemek için kullanılan AdMob reklam birimi kimliği. | 2747237135 |
custom_data |
ServerSideVerificationOptions::custom_data tarafından sağlanan özel veri dizesi.
Uygulama tarafından özel bir veri dizesi sağlanmazsa bu sorgu parametresi değeri SSV geri çağırmasında yer almaz. |
SAMPLE_CUSTOM_DATA_STRING |
key_id | SSV geri aramasını doğrulamak için kullanılacak anahtar. Bu değer, AdMob anahtar sunucusu tarafından sağlanan bir ortak anahtarla eşlenir. | 1234567890 |
reward_amount | Reklam birimi ayarlarında belirtilen ödül tutarı. | 5 |
reward_item | Reklam birimi ayarlarında belirtilen ödül öğesi. | bozuk paralar |
signature | AdMob tarafından oluşturulan SSV geri çağırma imzası. | MEUCIQCLJS_s4ia_sN06HqzeW7Wc3nhZi4RlW3qV0oO-6AIYdQIgGJEh-rzKreO-paNDbSCzWGMtmgJHYYW9k2_icM9LFMY |
timestamp | Kullanıcının ödüllendirildiği zamanın zaman damgası (ms cinsinden Epoch zamanı). | 1507770365237823 |
transaction_id | AdMob tarafından oluşturulan her ödül verme etkinliği için benzersiz onaltılık kodlanmış tanımlayıcı. | 18fa792de1bca816048293fc71035638 |
user_id | ServerSideVerificationOptions::user_id tarafından sağlanan kullanıcı tanımlayıcısı.
Uygulama tarafından kullanıcı tanımlayıcısı sağlanmazsa bu sorgu parametresi SSV geri çağırmasında yer almaz. |
1234567 |
Reklam kaynağı tanımlayıcıları
Reklam kaynağı adları ve kimlikleri
Reklam kaynağı adı | Reklam kaynağı kimliği |
---|---|
Ad Generation (teklif verme) | 1477265452970951479 |
AdColony | 15586990674969969776 |
AdColony (teklifli sistem) | 6895345910719072481 |
AdFalcon | 3528208921554210682 |
AdMob Ağı | 5450213213286189855 |
AdMob Ağı Şelalesi | 1215381445328257950 |
Applovin | 1063618907739174004 |
Applovin (teklifli sistem) | 1328079684332308356 |
Chartboost | 2873236629771172317 |
Chocolate Platform (teklif verme) | 6432849193975106527 |
Özel Etkinlik | 18351550913290782395 |
DT Exchange* * Bu ağ, 21 Eylül 2022'den önce "Fyber Marketplace" olarak adlandırılıyordu. | 2179455223494392917 |
Equativ (teklif verme)* * Bu ağ, 12 Ocak 2023'ten önce "Smart Adserver" olarak adlandırılıyordu. | 5970199210771591442 |
Fluct (teklifli sistem) | 8419777862490735710 |
Flurry | 3376427960656545613 |
Fyber* * Bu reklam kaynağı, geçmiş raporlama için kullanılır. | 4839637394546996422 |
i-mobile | 5208827440166355534 |
Improve Digital (teklif verme) | 159382223051638006 |
Index Exchange (teklif verme) | 4100650709078789802 |
InMobi | 7681903010231960328 |
InMobi (teklifli sistem) | 6325663098072678541 |
InMobi Exchange (teklif verme) | 5264320421916134407 |
IronSource | 6925240245545091930 |
ironSource Ads (teklif verme) | 1643326773739866623 |
Leadbolt | 2899150749497968595 |
Liftoff Monetize* * Bu ağ, 30 Ocak 2023'ten önce "Vungle" olarak adlandırılıyordu. | 1953547073528090325 |
Liftoff Monetize (teklif verme)* * Bu ağ, 30 Ocak 2023'ten önce "Vungle (teklif verme)" olarak adlandırılıyordu. | 4692500501762622185 |
LG U+AD | 18298738678491729107 |
LINE Ads Network | 3025503711505004547 |
Magnite DV+ (teklif verme) | 3993193775968767067 |
maio | 7505118203095108657 |
maio (bidding) | 1343336733822567166 |
Media.net (teklifli sistem) | 2127936450554446159 |
Uyumlulaştırılmış kurum reklamları | 6060308706800320801 |
Meta Audience Network* * Bu ağ, 6 Haziran 2022'den önce "Facebook Audience Network" olarak adlandırılıyordu. | 10568273599589928883 |
Meta Audience Network (açık artırma)* * Bu ağ, 6 Haziran 2022'den önce "Facebook Audience Network (açık artırma)" olarak adlandırılıyordu. | 11198165126854996598 |
Mintegral | 1357746574408896200 |
Mintegral (teklifli sistem) | 6250601289653372374 |
MobFox (teklifli sistem) | 3086513548163922365 |
MoPub (desteği sonlandırıldı) | 10872986198578383917 |
myTarget | 8450873672465271579 |
Nend | 9383070032774777750 |
Nexxen (teklifli sistem)* * Bu ağ, 1 Mayıs 2024'ten önce "UnrulyX" olarak adlandırılıyordu. | 2831998725945605450 |
OneTag Exchange (teklif verme) | 4873891452523427499 |
OpenX (teklifli sistem) | 4918705482605678398 |
Pangle | 4069896914521993236 |
Pangle (teklifli sistem) | 3525379893916449117 |
PubMatic (teklifli sistem) | 3841544486172445473 |
Rezervasyon kampanyası | 7068401028668408324 |
SK planet | 734341340207269415 |
Sharethrough (teklifli sistem) | 5247944089976324188 |
Smaato (teklifli sistem) | 3362360112145450544 |
Sonobi (teklifli sistem) | 3270984106996027150 |
Tapjoy | 7295217276740746030 |
Tapjoy (teklifli sistem) | 4692500501762622178 |
Tencent GDT | 7007906637038700218 |
TripleLift (teklifli sistem) | 8332676245392738510 |
Unity Ads | 4970775877303683148 |
Unity Ads (teklif verme) | 7069338991535737586 |
Verve Group (teklif verme) | 5013176581647059185 |
Vpon | 1940957084538325905 |
Yieldmo (teklifli sistem) | 4193081836471107579 |
YieldOne (teklifli sistem) | 3154533971590234104 |
Zucks | 5506531810221735863 |
Kullanıcıyı ödüllendirme
Kullanıcıya ne zaman ödül verileceğine karar verirken kullanıcı deneyimi ile ödül doğrulama arasında denge kurmak önemlidir. Sunucu tarafı geri aramalar, harici sistemlere ulaşmadan önce gecikmeler yaşayabilir. Bu nedenle, sunucu tarafı geri aramaları alındığında tüm ödüller üzerinde doğrulama işlemi gerçekleştirilirken kullanıcıyı hemen ödüllendirmek için istemci tarafı geri aramanın kullanılması en iyi uygulama olarak önerilir. Bu yaklaşım, verilen ödüllerin geçerliliğini sağlarken iyi bir kullanıcı deneyimi sunar.
Ancak ödül geçerliliğinin kritik olduğu uygulamalarda (ör. ödül, uygulamanızın oyun içi ekonomisini etkiliyorsa) ve ödüllerin verilmesinde gecikmeler kabul edilebilir olduğunda, doğrulanmış sunucu tarafı geri araması için beklemek en iyi yaklaşım olabilir.
Özel veriler
Sunucu tarafı doğrulama geri çağırmalarında ek veri gerektiren uygulamalar, ödüllü reklamların özel veri özelliğini kullanmalıdır. Bir ödüllü reklam nesnesinde ayarlanan tüm dize değerleri, SSV geri çağırmasının custom_data
sorgu parametresine iletilir. Özel veri değeri ayarlanmamışsa custom_data
sorgu parametresi değeri SSV geri çağırmasında bulunmaz.
Aşağıdaki kod örneğinde, reklam isteğinde bulunmadan önce ödüllü reklam nesnesinde özel verilerin nasıl ayarlanacağı gösterilmektedir.
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);
Özel ödül dizesini ayarlamak istiyorsanız bunu reklamı göstermeden önce yapmanız gerekir.
Ödüllü SSV'nin manuel olarak doğrulanması
Ödüllü bir SSV'yi doğrulamak için RewardedAdsVerifier
sınıfının gerçekleştirdiği adımlar aşağıda açıklanmıştır. Dahil edilen kod snippet'leri Java dilinde olsa ve Tink üçüncü taraf kitaplığını kullansa da bu adımlar, ECDSA'yı destekleyen herhangi bir üçüncü taraf kitaplığı kullanılarak istediğiniz dilde uygulanabilir.
Ortak anahtarları getirme
Ödüllü SSV geri aramasını doğrulamak için AdMob tarafından sağlanan bir ortak anahtara ihtiyacınız vardır.
Ödüllü SSV geri çağırmalarını doğrulamak için kullanılacak ortak anahtarların listesi AdMob anahtar sunucusundan alınabilir. Herkese açık anahtarların listesi, aşağıdaki gibi bir biçime sahip JSON gösterimi olarak sağlanır:
{
"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=="
},
],
}
Ortak anahtarları almak için AdMob anahtar sunucusuna bağlanıp anahtarları indirin. Aşağıdaki kod bu görevi yerine getirir ve anahtarların JSON gösterimini data
değişkenine kaydeder.
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();
}
Genel anahtarların düzenli olarak döndürüldüğünü unutmayın. Yaklaşan bir rotasyon hakkında sizi bilgilendiren bir e-posta alırsınız. Herkese açık anahtarları önbelleğe alıyorsanız bu e-postayı aldıktan sonra anahtarları güncellemeniz gerekir.
Ortak anahtarlar getirildikten sonra ayrıştırılmalıdır. Aşağıdaki parsePublicKeysJson
yöntemi, yukarıdaki örnek gibi bir JSON dizesini giriş olarak alır ve key_id
değerlerinden Tink kitaplığındaki ECPublicKey
nesneleri olarak kapsüllenmiş genel anahtarlara bir eşleme oluşturur.
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;
}
Doğrulanacak içerik alma
Ödüllü SSV geri çağırmalarının son iki sorgu parametresi her zaman signature
ve key_id,
şeklindedir. Kalan sorgu parametreleri, doğrulanacak içeriği belirtir. AdMob'u ödül geri çağırmalarını https://www.myserver.com/mypath
adresine gönderecek şekilde yapılandırdığınızı varsayalım. Aşağıdaki snippet'te, doğrulanacak içeriğin vurgulandığı bir örnek ödüllü SSV geri çağırması gösterilmektedir.
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
Aşağıdaki kodda, doğrulanacak içeriğin bir geri çağırma URL'sinden UTF-8 bayt dizisi olarak nasıl ayrıştırılacağı gösterilmektedir.
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"));
Geri çağırma URL'sinden imzayı ve key_id değerini alma
Önceki adımdaki queryString
değerini kullanarak geri çağırma URL'sindeki signature
ve key_id
sorgu parametrelerini aşağıdaki gibi ayrıştırın:
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()));
Doğrulama yapma
Son adım, geri çağırma URL'sinin içeriğini uygun ortak anahtarla doğrulamaktır. parsePublicKeysJson
yönteminden döndürülen eşlemeyi alın ve geri çağırma URL'sindeki key_id
parametresini kullanarak bu eşlemeden ortak anahtarı alın. Ardından, imzayı bu ortak anahtarla doğrulayın. Bu adımlar aşağıda verify
yönteminde gösterilmektedir.
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);
}
}
Yöntem, istisna hatası vermeden yürütülürse geri çağırma URL'si başarıyla doğrulanmıştır.
SSS
- AdMob anahtar sunucusu tarafından sağlanan ortak anahtarı önbelleğe alabilir miyim?
- SSV geri aramalarını doğrulamak için gereken işlem sayısını azaltmak amacıyla AdMob anahtar sunucusu tarafından sağlanan ortak anahtarı önbelleğe almanızı öneririz. Ancak ortak anahtarların düzenli olarak döndürüldüğünü ve 24 saatten uzun süre önbelleğe alınmaması gerektiğini unutmayın.
- AdMob anahtar sunucusu tarafından sağlanan ortak anahtarlar ne sıklıkta döndürülür?
- AdMob anahtar sunucusu tarafından sağlanan ortak anahtarlar, değişken bir takvime göre döndürülür. SSV geri çağırma doğrulamasının beklendiği gibi çalışmaya devam etmesini sağlamak için ortak anahtarlar 24 saatten uzun süre önbelleğe alınmamalıdır.
- Sunucuma ulaşılamazsa ne olur?
- Google, SSV geri çağırmaları için
HTTP 200 OK
başarı durumu yanıt kodu bekler. Sunucunuza ulaşılamıyorsa veya beklenen yanıtı vermiyorsa Google, bir saniyelik aralıklarla beş kez SSV geri aramaları göndermeyi yeniden dener. - SSV geri aramalarının Google'dan geldiğini nasıl doğrulayabilirim?
- SSV geri çağırmalarının Google'dan kaynaklandığını doğrulamak için ters DNS araması kullanın.