【问题标题】:How to verify a Postback with Skadnetwork/Apple如何使用 Skadnetwork/Apple 验证回发
【发布时间】:2021-02-06 07:32:11
【问题描述】:

根据documentation Apple 发出的消息,我无法通过 Skadnetwork/Apple 验证回发。

我有两个问题(至少我认为只有两个问题)。

  1. \u2063 - 我正在使用 PHP 从 POST 中获取所有信息,然后创建字符串以供以后验证。遗憾的是,我不确定 \u2063 是否应该简单地存在于字符串中,或​​者是否应该以某种编码/解码的方式存在。
  2. Apple 公钥 - 如何使用它。以某种解码/编码方式在文档中看到的版本。文档说解码 base 64,然后从中创建 X.509 标准公钥。

有人有一个可行的例子吗?此刻我完全迷路了。

【问题讨论】:

  • 你能用 PHP 解决这个问题吗?

标签: postback x509 skadnetwork


【解决方案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 here 的包装类以类似的方式完成

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 没有任何经验:/

【讨论】:

  • 非常感谢 - 这对我帮助很大。我能够将 Python 版本包含到我的代码中。
猜你喜欢
  • 2020-12-16
  • 2020-02-10
  • 2021-04-25
  • 1970-01-01
  • 2019-10-20
  • 2012-05-04
  • 2022-12-04
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多