Sunucu tarafı doğrulama (SSV) geri çağırmalarını doğrulama

Sunucu tarafı doğrulama geri çağırmaları, sorgu parametrelerine sahip URL istekleridir. gönderilen veriler, Google tarafından harici bir sisteme gönderilir. etkileşimde bulunduğu için bir kullanıcının ödül kazanacağını bildirmeli ödüllü geçiş reklamı. Ödüllü SSV (sunucu tarafı doğrulama) geri çağırmaları istemci taraflı geri çağırmalarda adres sahteciliğine karşı ek bir koruma katmanı sağlar .

Bu kılavuzda, Tink Java Apps üçüncü taraf geri çağırma işlevindeki sorgu parametrelerinin geçerli olmalıdır. Tink, bu kılavuzun amacına uygun şekilde kullanılsa da, destekleyen herhangi bir üçüncü taraf kitaplığını ECDSA'da bulabilirsiniz. Ayrıca, sunucunuzu test etmek için test aracını kullanın.

Bu bağlantılardan tam olarak örnek ile başlayın.

Ön koşullar

Tink Java Uygulamaları kitaplığından RewardAdsVerifier hizmetini kullanın

Tink Java Uygulamaları GitHub deposu şunları içerir: RewardedAdsVerifier yardımcı sınıfı kullanarak ödüllü SSV geri çağırmasını doğrulamak için gereken kodu azaltın. Bu sınıfı kullanmanız, aşağıdaki kodla geri çağırma URL'sini doğrulamanıza olanak tanır.

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

verify() yöntemi bir istisna oluşturmadan yürütülürse geri çağırma URL başarıyla doğrulandı. Kullanıcıyı ödüllendirme bölümünde, kullanıcıların ne zaman ödüllendirileceğine ilişkin en iyi uygulamalar ayrıntılı olarak açıklanıyor. Örneğin, ödüllü SSV geri çağırmalarını doğrulamak için bu sınıfın gerçekleştirdiği adımların dökümü, Ödüllü reklamların manuel olarak doğrulanması SSV bölümünü inceleyin.

SSV geri çağırma parametreleri

Sunucu tarafı doğrulama geri çağırmaları, ödüllü reklam etkileşimi Parametre adları, açıklamaları ve örnek değerleri: aşağıda listelenmiştir. Parametreler alfabetik sırada 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ı. Reklam kaynağı kimlik değerlerine karşılık gelen adlar, Reklam kaynak tanımlayıcıları bölümünü inceleyin. 1953547073528090325
ad_unit Ödüllü reklam isteğinde bulunmak için kullanılan AdMob reklam birimi kimliği. 2747237135
custom_data Sağlandığı şekliyle özel veri dizesi . setCustomData .

Uygulama tarafından herhangi bir özel veri dizesi sağlanmazsa bu sorgu parametresi değeri, SSV geri çağırmasında bulunmayacaktır.

SAMPLE_CUSTOM_DATA_STRING
key_id SSV geri arama isteğini doğrulamak için kullanılacak anahtar. Bu değer bir ortak anahtara eşlenir AdMob anahtar sunucusu tarafından sağlanır. 1234567890
reward_amount Reklam birimi ayarlarında belirtilen ödül tutarı. 5
reward_item Reklam birimi ayarlarında belirtildiği şekilde ödül öğesi. madeni paralar
signature AdMob tarafından oluşturulan SSV geri aramasına ilişkin imza. MEUCIQCLJS_s4ia_sN06HqzeW7Wc3nhZi4RlW3qV0oO-6AIYdQIgGJEh-rzKreO-paNDbSCzWGMtmgJHYYW9k2_icM9LFMY
timestamp Kullanıcının ms cinsinden Epoch zamanı olarak ödüllendirildiği zaman damgası. 1507770365237823
transaction_id AdMob tarafından oluşturulan her ödül bağışı etkinliği için onaltılık kodlanmış benzersiz tanımlayıcı. 18fa792de1bca816048293fc71035638
user_id tarafından sağlandığı şekliyle kullanıcı tanımlayıcısı . setUserId

Uygulama tarafından hiçbir kullanıcı tanımlayıcısı sağlanmazsa bu sorgu parametresi SSV geri çağırmasında bulunmalıdır.

1234567

Reklam kaynağı tanımlayıcıları

Reklam kaynağı adları ve kimlikleri

Reklam kaynağı adı Reklam kaynağı kimliği
Aarki (teklifli sistem)5240798063227064260
Reklam oluşturma (teklifli sistem)1477265452970951479
AdColony15586990674969969776
AdColony (SDK dışı) (teklifli sistem)4600416542059544716
AdColony (teklifli sistem)6895345910719072481
AdFalcon3528208921554210682
AdMob Ağı5450213213286189855
AdMob Ağı şelalesi1215381445328257950
ADResult10593873382626181482
AMoAd17253994435944008978
Applovin1063618907739174004
Applovin (teklifli sistem)1328079684332308356
Chartboost2873236629771172317
Çikolata Platformu (teklifli sistem)6432849193975106527
Çapraz Kanal (MdotM)9372067028804390441
Özel Etkinlik18351550913290782395
DT Exchange*
* Bu ağ, 21 Eylül 2022'den önce "Fyber Pazar Yeri" olarak adlandırılıyordu.
2179455223494392917
EMX (teklifli sistem)8497809869790333482
Dalgalanma (teklifli sistem)8419777862490735710
Hafif kar yağışı3376427960656545613
Fyber*
* Bu reklam kaynağı, geçmiş raporlar için kullanılır.
4839637394546996422
i-mobile5208827440166355534
İyileştirme Dijital (teklifli sistem)159382223051638006
Dizin Borsası (teklifli sistem)4100650709078789802
InMobi7681903010231960328
InMobi (teklifli sistem)6325663098072678541
InMobi Exchange (teklifli sistem)5264320421916134407
IronSource6925240245545091930
ironSource Reklamları (teklifli sistem)1643326773739866623
Leadbolt2899150749497968595
LG U+REKLAM18298738678491729107
LINE Reklamlar Ağı3025503711505004547
Maio7505118203095108657
maio (teklifli sistem)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 (teklifli sistem)*
* Bu ağ, 6 Haziran 2022'den önce "Facebook Audience Network (teklifli sistem)" olarak adlandırılıyordu.
11198165126854996598
Mintegral1357746574408896200
Mintegral (teklifli sistem)6250601289653372374
MobFox8079529624516381459
MobFox (teklifli sistem)3086513548163922365
MoPub (desteği sonlandırılmış)10872986198578383917
myTarget8450873672465271579
Nend9383070032774777750
Nexxen (teklifli sistem)*

* Bu ağ, 1 Mayıs 2024'ten önce "UnrulyX" olarak adlandırılıyordu.

2831998725945605450
AOL'den ONE (Millennial Media)6101072188699264581
AOL'den ONE (Nexage)3224789793037044399
OneTag Exchange (teklifli sistem)4873891452523427499
OpenX (teklifli sistem)4918705482605678398
Pangle4069896914521993236
Pangle (teklifli sistem)3525379893916449117
PubMatic (teklifli sistem)3841544486172445473
Rezervasyon kampanyası7068401028668408324
RhythmOne (teklifli sistem)2831998725945605450
Rubicon (teklifli sistem)3993193775968767067
SK gezegeni734341340207269415
Paylaşım (teklifli sistem)5247944089976324188
Smaato (teklifli sistem)3362360112145450544
Equativ (teklifli sistem)*

* Bu ağ, 12 Ocak 2023'ten önce "Smart Adserver" olarak adlandırılıyordu.

5970199210771591442
Sonobi (teklifli sistem)3270984106996027150
Tapjoy7295217276740746030
Tapjoy (teklifli sistem)4692500501762622178
Tencent GDT7007906637038700218
TripleLift (teklifli sistem)8332676245392738510
Unity Reklamları4970775877303683148
Unity Reklamları (teklifli sistem)7069338991535737586
Verizon Media7360851262951344112
Verve Group (teklifli sistem)5013176581647059185
Vpon1940957084538325905
Liftoff Para Kazanma*

* Bu ağ, 30 Ocak 2023'ten önce "Vungle" olarak adlandırılıyordu.

1953547073528090325
Liftoff Para Kazanma (teklifli sistem)*

* Bu ağ, 30 Ocak 2023'ten önce "Vungle (teklifli sistem)" olarak adlandırılıyordu.

4692500501762622185
Yieldmo (teklifli sistem)4193081836471107579
YieldOne (teklifli sistem)3154533971590234104
Zucks5506531810221735863

Kullanıcıyı ödüllendirme

Karar verirken kullanıcı deneyimini dengelemek ve doğrulamayı ödüllendirmek önemlidir ne zaman ödüllendirileceğini belirleyin. Sunucu tarafı geri çağırmalarda gecikmeler yaşanabilir harici sistemlere ulaşmak. Bu nedenle, önerilen en iyi uygulama kullanıcıyı hemen ödüllendirmek için istemci taraflı geri çağırmayı tüm ödüller için doğrulama işlemini tamamladığımızı hatırlatırız. Bu yaklaşımında iyi bir kullanıcı deneyimi sunarken, aynı zamanda ödüller.

Bununla birlikte, ödül geçerliliğinin çok önemli olduğu (örneğin, (uygulamanızın oyun içi ekonomisini etkiler) ve ödül vermede gecikme yaşanması kabul edilebilir, doğrulanmış sunucu tarafı geri çağırmasını beklemek en iyisi bahsedeceğiz.

Özel veriler

Sunucu tarafı doğrulama geri çağırmalarında ek veri gerektiren uygulamalar ödüllü reklamların özel veri özelliği. Ödüllü reklamda ayarlanan herhangi bir dize değeri nesnesi, SSV geri çağırmasının custom_data sorgu parametresine iletilir. Yanıt hayır ise: özel veri değeri ayarlandığında, custom_data sorgu parametresi değeri mevcut olduğu anlamına gelir.

Aşağıdaki kod örneğinde, ödüllü reklam yüklendiğinde.

Java

RewardedAd.load(MainActivity.this, "ca-app-pub-3940256099942544/5354046379",
    new AdRequest.Builder().build(),  new RewardedAdLoadCallback() {
  @Override
  public void onAdLoaded(RewardedAd ad) {
    Log.d(TAG, "Ad was loaded.");
    rewardedAd = ad;
    ServerSideVerificationOptions options = new ServerSideVerificationOptions
        .Builder()
        .setCustomData("SAMPLE_CUSTOM_DATA_STRING")
        .build();
    rewardedAd.setServerSideVerificationOptions(options);
  }
  @Override
  public void onAdFailedToLoad(LoadAdError loadAdError) {
    Log.d(TAG, loadAdError.toString());
    rewardedAd = null;
  }
});

Kotlin

RewardedAd.load(this, "ca-app-pub-3940256099942544/5354046379",
    AdRequest.Builder().build(), object : RewardedAdLoadCallback() {
  override fun onAdLoaded(ad: RewardedAd) {
    Log.d(TAG, "Ad was loaded.")
    rewardedInterstitialAd = ad
    val options = ServerSideVerificationOptions.Builder()
        .setCustomData("SAMPLE_CUSTOM_DATA_STRING")
        .build()
    rewardedAd.setServerSideVerificationOptions(options)
  }

  override fun onAdFailedToLoad(adError: LoadAdError) {
    Log.d(TAG, adError?.toString())
    rewardedAd = null
  }
})

Özel ödül dizesini ayarlamak istiyorsanız göstermeden önce bunu yapmanız gerekir reklam.

.

Ödüllü SSV için manuel doğrulama

Ödüllü bir reklamı doğrulamak için RewardedAdsVerifier sınıfının gerçekleştirdiği adımlar SSV aşağıda özetlenmiştir. Dahil edilen kod snippet'leri Java ve Tink üçüncü taraf kitaplığından yararlanıyorsanız, bu adımları Google Play'de destekleyen herhangi bir üçüncü taraf kitaplığını kullanarak istediğiniz dili ECDSA'da bulabilirsiniz.

Ortak anahtarları getir

Ödüllü SSV geri arama işlemini doğrulamak için AdMob tarafından sağlanan bir ortak anahtara ihtiyacınız vardır.

Ödüllü SSV geri çağırmalarının doğrulanması için kullanılacak ortak anahtarların listesi AdMob anahtarından getirilir. sunucu değerleridir. Ortak anahtarların listesi aşağıdakine benzer bir biçimde 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ın ve tuşlarını kullanın. Aşağıdaki kod bu görevi gerçekleştirir ve JSON dosyasını kaydeder data değişkenine ilişkin anahtarların gösterimi.

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 döndürüldüğünü unutmayın. Konuyla ilgili size yardımcı olabilir. Ortak anahtarları önbelleğe alıyorsanız anahtarlara teslim edilir.

Ortak anahtarlar getirildikten sonra ayrıştırılmalıdır. İlgili içeriği oluşturmak için kullanılan Aşağıdaki parsePublicKeysJson yöntemi, örnekteki gibi bir JSON dizesi alır ve key_id değerlerinden ortak anahtarlara bir eşleme oluşturur. Bunlar, Tink kitaplığından ECPublicKey nesneleri olarak kapsüllenmiş durumdadır.

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 signature olur key_id, ve bu sırada. Kalan sorgu parametreleri, doğrulanması gerekir. AdMob'u, ödül geri çağırması için AdMob'u yapılandırdığınızı varsayalım. https://www.myserver.com/mypath Aşağıdaki snippet'te ödüllü reklam örneği gösterilmektedir Doğrulanacak içeriğin vurgulandığı SSV geri çağırması.

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

Aşağıdaki kod, bir geri çağırma URL'sini UTF-8 bayt dizisi olarak kullanın.

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 imza ve key_id öğesini alın

Önceki adımda bulunan queryString değerini kullanarak signature ve Geri çağırma URL'sinden aşağıda gösterildiği gibi key_id sorgu parametresi:

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 gerçekleştirme

Son adım, uygun bir ortak anahtara hayat verin. parsePublicKeysJson yöntemini kullanın ve geri çağırmanın key_id parametresini kullanın Bu eşlemeden ortak anahtarı almak için URL. Ardından şununla imzayı doğrulayın: bu ortak anahtarı kullanın. Bu adımlar aşağıdaki verify yönteminde gösterilmiştir.

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 bir istisna olmadan yürütülürse geri çağırma URL'si başarıyla doğrulandı.

SSS

AdMob anahtar sunucusu tarafından sağlanan ortak anahtarı önbelleğe alabilir miyim?
AdMob anahtarı tarafından sağlanan ortak anahtarı önbelleğe almanızı öneririz SSV'yi doğrulamak için gereken işlem sayısını azaltmak üzere sunucuya daha fazla bilgi edindiniz. Ancak ortak anahtarların düzenli olarak döndürüldüğünü ve 24 saatten uzun süre önbellekte tutulur.
AdMob anahtar sunucusu tarafından sağlanan ortak anahtarlara ne sıklıkta rotasyon uygulanır?
AdMob anahtar sunucusu tarafından sağlanan ortak anahtarlar, bir değişkene göre döndürülür hakkında bilgi edindiniz. SSV geri çağırmalarının doğrulanmasının genel anahtarlar 24 saatten uzun bir süre boyunca önbelleğe alınmamalıdır.
Sunucuma erişemezse ne olur?
Google, SSV için HTTP 200 OK başarı durumu yanıt kodu bekler daha fazla bilgi edindiniz. Sunucunuza ulaşılamıyorsa veya beklenen sunucu sağlanmıyorsa Google, SSV geri çağırması için bu süre içinde en fazla beş kez saniyelik aralıklarla kullanılabilir.
SSV geri aramalarının Google'dan geldiğini nasıl doğrulayabilirim?
SSV geri aramalarının Google'dan geldiğini doğrulamak için ters DNS aramasını kullanın.