Как проверить рекламное видео Admob с вознаграждением на сервере?

Есть ли способ проверить, просматривал ли клиент видео с рекламой за вознаграждение (OnAdRewarded) на сервере? Могу ли я использовать интеграцию с Google Cloud Functions?

Я думал, что можно проверить токен, отправленный клиентом на сервер с помощью admob admin SDK, но кажется, что это невозможно, и мы можем проверить только рекламу на клиенте.

5 ответов

Решение

Не сейчас. Функция была в закрытой бета-версии некоторое время из того, что я недавно собрал. Последнее упоминание, которое я смог найти, было в связанном обсуждении, где кто-то, предположительно из Google, говорит, что эта функция скоро будет представлена ​​широкой публике. Пост от 22 января.

https://groups.google.com/forum/

It is now possible with Server-Side Verification (SSV) Callbacks.

Server-side verification callbacks are URL requests, with query parameters expanded by Google, that are sent by Google to an external system to notify it that a user should be rewarded for interacting with a rewarded video ad. Rewarded video SSV (server-side verification) callbacks provide an extra layer of protection against spoofing of client-side callbacks to reward users.

Не уверен, что это имеет отношение к Firebase, но вот некоторые подробности на случай, если кто-то использует Node / JS. Вы можете использовать встроенный в Node cryptoбиблиотека. Первый fetch доступные ключи верификатора Google AdMob из https://gstatic.com/admob/reward/verifier-keys.json.

Затем вам нужно будет перебрать возвращенный JSON keys массив и возьмите pem строка файла открытого ключа, соответствующая req.query.key_id параметр вашей входящей строки.

Тогда "сообщение", с помощью которого мы хотим проверить подписи, - это входящая подстрока между параметром ? символ и &signature... струны.

Теперь мы можем легко проверить:

         const verifier = crypto.createVerify("sha256");
   
   verifier.update(message);
   
   if(verifier.verify(pem, req.query.signature, "base64"))
      console.log("Ad was successfully verified.");
   else
      console.log("Ad could not be verified - quick call the cops !");

Следует остерегаться одного предостережения: вам может потребоваться unescape(...) ваш req.urlстроку перед ее использованием, поскольку некоторые символы могли быть экранированы. Я застрял в этом на час или два. Вы можете сделать это, например, используя встроенный в Node querystring библиотека.

Я знаю, что это немного поздно, но вот фрагмент кода, который мне помог. Это в javascript для пользователей Node. https://github.com/hypeben/admob-rewarded-ads-ssv

      const queryString = require('query-string');
const crypto = require('crypto');
const axios = require('axios');
const GOOGLE_AD_KEY_URL = 'https://gstatic.com/admob/reward/verifier-keys.json';

/**
 * Fetches the google public keys for the admob providers.
 * These keys changes time to time.
 */
 const getGoogleKeysMap = async () => {
 let googleKeyRes = await axios.get(GOOGLE_AD_KEY_URL);
 let {keys} = googleKeyRes.data;
 if (!keys) {
 throw new Error('No keys found from google keys');
 }
 /** For each of the keys array save it base 64 in decoded form in the key map */
 let keyMap = {};
 keys.forEach(k => {
 keyMap[`${k.keyId}`] = crypto.createPublicKey(k.pem);
 console.log(keyMap[`${k.keyId}`]);
 });
 return keyMap;
 };

/**
 * Verifies the callback url query params string,
 * Resolves the promise if verification was successful, else fails.
 * Wanna 'debug' then pass the second parameter as true.
  * @param {String} queryUrl
  * @param {Boolean} debug 
 */
async function verify(queryUrl, debug) {

try {

if (typeof queryUrl !== "string") throw new TypeError("URL needs to be string!");

/**
 * Request coming as callback from admob must contain the 'signature' and the  'user_id'.
 * For more info https://developers.google.com/admob/android/rewarded-video-ssv
 */
const {signature, key_id} = queryString.parse(queryUrl);
if (!signature) {
  throw new Error('No signature value exist in the URL param');
}

if(debug) {
  console.debug('Signature and KeyId ---');
  console.debug(signature, key_id);
//  console.log('Signature and KeyId ---');
//  console.log(signature, key_id);
}

let queryParamsString = queryUrl;
if (queryParamsString.indexOf('?') > -1) {
  queryParamsString = queryUrl.split('?')[1];
}

if(debug) {
  console.debug('Query param string ---');
 // console.log('Query param string ---');
  console.debug(queryParamsString);
 // console.log(queryParamsString);
}

/**
 * As per admob, 
 * The last two query parameters of rewarded video SSV callbacks are always signature and key_id, in that order.
 * The remaining query parameters specify the content to be verified. 
 */
let contentToVerify = queryParamsString.substring(0, queryParamsString.indexOf('signature') -1);

if(debug) {
  console.debug('Content to verify ---');
 // console.log(contentToVerify);
 // console.log('Content to verify ---');
  console.debug(contentToVerify);
}

let keyMap = await getGoogleKeysMap();

if(keyMap[`${key_id}`]) {
  let publicKey = keyMap[`${key_id}`];
  const verifier = crypto.createVerify('RSA-SHA256');
  verifier.update(contentToVerify);
  let result = verifier.verify(publicKey, signature, 'base64');
  if (result) {
    console.debug('Result ---');
     console.debug(result);
    return true;
  } else {
    console.debug('Failure ---');
    console.debug(result);
    throw new Error('Invalid Signature Supplied');
  }
} else {
  console.debug('Key id provided doesn\'t exist ---');
  throw new Error('Key id provided doesn\'t exist in the google public keys');
}


  } catch (error) {

 }

}

module.exports.verify = verify;

Если вы, ребята, ищете простой способ на Golang для Admob SSV.

Просто используйте этот https://github.com/hiyali/go-lib-ssv, надейтесь спасти свою жизнь:)

Другие вопросы по тегам