Sunucu tarafı doğrulama geri çağırmaları, Google tarafından genişletilen sorgu parametreleri içeren URL istekleridir. Bu istekler, bir kullanıcının ödüllü veya ödüllü geçiş reklamıyla etkileşimde bulunduğu için ödüllendirilmesi gerektiğini bildirmek üzere Google tarafından harici bir sisteme gönderilir. Ödüllü SSV (sunucu tarafı doğrulaması) geri çağırmaları, ödül verilen kullanıcıları ödüllendirmek için istemci tarafı geri çağırmaların adres 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 üçüncü taraf kriptografi kitaplığını kullanarak ödüllü SSV geri çağırmalarını nasıl doğrulayacağınız gösterilmektedir. Bu kılavuzda Tink kullanılmış olsa da ECDSA'yı destekleyen herhangi bir üçüncü taraf kitaplığını kullanabilirsiniz. Sunucunuzu AdMob kullanıcı arayüzündeki test aracıyla da test edebilirsiniz.
Ön koşullar
- Reklam biriminizde ödül için sunucu tarafı doğrulamasını etkinleştirin.
Tink Java Uygulama kitaplığından 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ünü Ödüllü SSV'nin manuel doğrulaması bölümünde bulabilirsiniz.
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ı yayınlayan 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 |
customData tarafından sağlanan özel veri dizesi.
Uygulama tarafından özel veri dizesi sağlanmazsa bu sorgu parametresi değeri SSV geri çağırmasında yer almaz. |
SAMPLE_CUSTOM_DATA_STRING |
| key_id | SSV geri çağırması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. | madeni para |
| 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 milisaniye cinsinden Epoch zaman damgası. | 1507770365237823 |
| transaction_id | AdMob tarafından oluşturulan her ödül verme etkinliği için onaltılık kodlanmış benzersiz tanımlayıcı. | 18fa792de1bca816048293fc71035638 |
| user_id | userId tarafından sağlanan kullanıcı kimliği.
Uygulama tarafından kullanıcı kimliği 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 (teklifli sistem) | 1477265452970951479 |
| AdMob Ağı | 5450213213286189855 |
| AdMob Ağı şelalesi | 1215381445328257950 |
| AppLovin | 1063618907739174004 |
| AppLovin (teklifli sistem) | 1328079684332308356 |
| Bidease (teklif verme) | 3670825090829827805 |
| BidMachine (teklifli sistem) | 7943972370566394673 |
| 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 |
| DT Exchange (teklifli sistem) | 8189833498765234879 |
| Equativ (teklifli sistem)* * 12 Ocak 2023'ten önce bu ağın adı "Smart Adserver"dı. | 5970199210771591442 |
| Fluct (teklifli sistem) | 8419777862490735710 |
| i-mobile | 5208827440166355534 |
| Improve Digital (teklifli sistem) | 159382223051638006 |
| Index Exchange (teklifli sistem) | 4100650709078789802 |
| InMobi | 7681903010231960328 |
| InMobi (SDK) (teklifli sistem) | 8468954295581492586 |
| InMobi Exchange (teklifli sistem) | 5264320421916134407 |
| ironSource Ads | 6925240245545091930 |
| ironSource Ads (teklifli sistem) | 1643326773739866623 |
| Liftoff Monetize* * 30 Ocak 2023'ten önce bu ağın adı "Vungle" idi. | 1953547073528090325 |
| Liftoff Monetize (teklifli sistem)* * Bu ağ, 30 Ocak 2023'ten önce "Vungle (teklif verme)" olarak adlandırılıyordu. | 4692500501762622185 |
| LY Ads Network | 3025503711505004547 |
| LY Reklam Ağı (teklifli sistem) | 2615812619460460513 |
| Magnite DV+ (teklifli sistem) | 3993193775968767067 |
| maio | 7505118203095108657 |
| 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 (teklifli sistem)* * 6 Haziran 2022'den önce bu ağın adı "Facebook Audience Network (teklifli sistem)" idi. | 11198165126854996598 |
| Mintegral | 1357746574408896200 |
| Mintegral (teklifli sistem) | 6250601289653372374 |
| Mobfox (teklifli sistem) | 3086513548163922365 |
| MobileFuse (teklif verme) | 7303547408604090310 |
| Moloco Ads SDK (teklifli sistem) | 8267622065755668722 |
| myTarget | 8450873672465271579 |
| Nativo (teklif) | 3240503836211327896 |
| Nexxen (teklif verme)* * Bu ağ, 1 Mayıs 2024'ten önce "UnrulyX" olarak adlandırılıyordu. | 2831998725945605450 |
| OneTag Exchange (teklifli sistem) | 4873891452523427499 |
| OpenX (teklif verme) | 4918705482605678398 |
| Pangle | 4069896914521993236 |
| Pangle KR SDK (teklifli sistem) | 12171279046073404914 |
| Pangle ROW SDK (teklifli sistem) | 3525379893916449117 |
| Pangle US SDK'sı (teklif) | 15999446638585856012 |
| PubMatic (teklif verme) | 3841544486172445473 |
| PubMatic OpenWrap SDK | 7702975372504485373 |
| PubMatic OpenWrap SDK (teklifli sistem) | 1234567890123456789 |
| Rezervasyon kampanyası | 7068401028668408324 |
| Rise (teklifli sistem) | 6816468518946650043 |
| Sharethrough (teklifli sistem) | 5247944089976324188 |
| Smaato (teklifli sistem) | 3362360112145450544 |
| Sonobi (teklif verme) | 3270984106996027150 |
| TripleLift (teklif verme) | 8332676245392738510 |
| Unity Ads | 4970775877303683148 |
| Unity Ads (teklifli sistem) | 7069338991535737586 |
| Verve Group (teklif verme) | 5013176581647059185 |
| Vpon | 1940957084538325905 |
| Yieldmo (teklif verme) | 4193081836471107579 |
| YieldOne (teklif) | 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 çağırmaların harici sistemlere ulaşması gecikebilir. Bu nedenle, kullanıcıyı hemen ödüllendirmek için istemci tarafı geri çağırmayı kullanmanız, sunucu tarafı geri çağırmalar alındığında ise tüm ödülleri doğrulamanız ö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 (örneğin, ödülün uygulamanızın oyun içi ekonomisini etkilediği) ve ödül verme işlemlerindeki gecikmelerin kabul edilebilir olduğu uygulamalarda, doğrulanmış sunucu tarafı geri çağırmayı beklemek en iyi yaklaşım olabilir.
Müşteri verileri
Sunucu tarafı doğrulama geri çağırmalarında ek veri gerektiren uygulamalar, ödüllü reklamların özel veri özelliğini kullanmalıdır. Ö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 ayarlanmazsa custom_data sorgu parametresi değeri SSV geri çağırmasında mevcut olmaz.
Aşağıdaki örnekte, ödüllü reklam yüklendikten sonra SSV seçenekleri ayarlanmaktadır:
SAMPLE_CUSTOM_DATA_STRING değerini özel verilerinizle değiştirin.
Ö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ü SSV'yi doğrulamak için RewardedAdsVerifier sınıfı tarafından gerçekleştirilen adımlar aşağıda açıklanmıştır. Dahil edilen kod snippet'leri Java'da olsa ve Tink üçüncü taraf kitaplığından yararlansa da bu adımları, ECDSA'yı destekleyen herhangi bir üçüncü taraf kitaplığını kullanarak istediğiniz dilde uygulayabilirsiniz.
Ortak anahtarları getirme
Ödüllü SSV geri çağırması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 biçime benzer bir 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();
}
Ortak anahtarların düzenli olarak değiştirildiğini unutmayın. Yaklaşan bir rotasyon hakkında sizi bilgilendiren bir e-posta alırsınız. Ortak 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 örnekte olduğu gibi bir JSON dizesini giriş olarak alır ve key_id değerlerinden ortak anahtarlara bir eşleme oluşturur. Bu anahtarlar, Tink kitaplığından ECPublicKey nesneleri olarak kapsüllenir.
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;
}
İçeriğin doğrulanmasını sağlama
Ödüllü SSV geri çağırmalarının son iki sorgu parametresi her zaman sırasıyla 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ığı örnek bir ödüllü SSV geri çağırma işlemi 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'yi alma
Önceki adımda elde ettiğiniz queryString değerini kullanarak geri çağırma URL'sindeki signature ve key_id sorgu parametrelerini aşağıda gösterildiği 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 bu eşlemeden ortak anahtarı almak için geri çağırma URL'sindeki key_id parametresini kullanın. Ardından, bu ortak anahtarla
imzayı 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 oluşturmadan 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 değiştirildiğini 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 programa göre değiştirilir. SSV geri çağırma doğrulamasının beklendiği gibi çalışmaya devam etmesi için ortak anahtarlar 24 saatten uzun süre önbelleğe alınmamalıdır.
- Sunucuma erişilemezse ne olur?
- Google, SSV geri çağırmaları için
HTTP 200 OKbaşarı durumu yanıt kodu bekler. Sunucunuza ulaşılamıyorsa veya sunucunuz beklenen yanıtı vermiyorsa Google, SSV geri çağırmalarını bir saniyelik aralıklarla beş defaya kadar yeniden göndermeyi dener. - SSV geri çağırmalarının Google'dan geldiğini nasıl doğrulayabilirim?
- SSV geri çağırmalarının Google'dan geldiğini doğrulamak için ters DNS araması kullanın.