Как подтвердить постбэк через Skadnetwork/Apple

У меня возникают проблемы с проверкой обратной передачи через Skadnetwork/Apple в соответствии с документацией, которую Apple предоставляет.

У меня есть две проблемы (по крайней мере, я думаю, что есть только две проблемы).

  1. \u2063- Я использую PHP, чтобы получить всю информацию из POST, а затем создать строку для последующей проверки. К сожалению, я не уверен, что \u2063 должен просто присутствовать в строке или, если он должен быть закодирован / декодирован.
  2. Открытый ключ Apple - как его использовать. Версия, которая представлена ​​в документации в некотором декодировании / кодировании. Документы говорят, что декодируют базу 64, а затем создают из нее стандартный открытый ключ X.509.

У кого-нибудь есть рабочий пример? На данный момент я совершенно потерялся.

1 ответ

Я использую NodeJS, и это было довольно просто. Я взял открытый ключ Apple и обернул его -----BEGIN PUBLIC KEY-----\nа также \n-----END PUBLIC KEY-----.

      -----BEGIN PUBLIC KEY-----
<APPLE_PUBLIC_KEY_BASE_64 (copy paste from Apple's guide)>
-----END PUBLIC KEY-----

Или вы можете использовать криптомодуль NodeJs для загрузки открытого ключа:

      const key = Buffer.from(`<APPLE_PUBLIC_KEY_BASE_64 (copy paste from Apple's guide)>`, 'base64');
const publicKey = crypto.createPublicKey({
  key,
  format: 'der',
  type: 'spki',
});

Затем я объединил части постбека, необходимые для проверки, с помощью \u2063разделитель.

      // ad network version 2.0/2.1
const message = [
  version,
  adNetworkId,
  campaignId,
  appId,
  transactionId,
  redownload,
].join('\u2063');

Затем я использовал криптомодуль NodeJS для проверки подписи:

      const verify = crypto.createVerify('sha256');
verify.update(message);
verify.verify(publicKey, signature, 'base64'); // this returns a boolean

Это можно сделать аналогичным образом с Singular-SKAdNetwork-App. ECDSAкласс-оболочка отсюда

      SEPERATOR = u"\u2063"

postback = {
    "version": "2.1",
    "ad-network-id": "com.example",
    "campaign-id": 42,
    "transaction-id": "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28",
    "app-id": 525463029,
    "attribution-signature": "MEUCID6rbq3qt4GvFaAaynh5/LAcvn1d8CQTRhrZhLIxLKntAiEAo7IrvoMw6u2qDg6Tr5vIsEHXjlLkPlCOL0ojJcEh3Qw=",
    "redownload": True,
    "source-app-id": 1234567891,
    "conversion-value": 20
}

pub_key = """
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdp8GPcGqmhgzEFj9Z2nSpQVddayaPe4FMzqM9wib1+aHaaIzoHoLN9zW4K8y4SPykE3YVK3sVqW6Af0lfx3gg==
-----END PUBLIC KEY-----
"""

message = (
    postback["version"]
    + SEPERATOR
    + postback["ad-network-id"]
    + SEPERATOR
    + str(postback["campaign-id "])
    + SEPERATOR
    + str(postback["app-id "])
    + SEPERATOR
    + postback["transaction-id"]
    + SEPERATOR
    + str(postback["redownload"]).lower()
    + SEPERATOR
    + str(postback["source-app-id"])
)

ecdsa = ECDSA(pub_key)
signature = postback["attribution-signature"]
ecdsa.verify(message, signature) # this returns a boolean

Я надеюсь, это поможет. У меня нет опыта работы с PHP :/

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