Как проверить рекламное видео Admob с вознаграждением на сервере?
Есть ли способ проверить, просматривал ли клиент видео с рекламой за вознаграждение (OnAdRewarded) на сервере? Могу ли я использовать интеграцию с Google Cloud Functions?
Я думал, что можно проверить токен, отправленный клиентом на сервер с помощью admob admin SDK, но кажется, что это невозможно, и мы можем проверить только рекламу на клиенте.
5 ответов
Не сейчас. Функция была в закрытой бета-версии некоторое время из того, что я недавно собрал. Последнее упоминание, которое я смог найти, было в связанном обсуждении, где кто-то, предположительно из Google, говорит, что эта функция скоро будет представлена широкой публике. Пост от 22 января.
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, надейтесь спасти свою жизнь:)