如何使用 Skadnetwork/Apple 验证回发
How to verify a Postback with Skadnetwork/Apple
根据 documentation Apple 提供的信息,我无法通过 Skadnetwork/Apple 验证回发。
我有两个问题(至少我认为只有两个问题)。
\u2063
- 我正在使用 PHP 从 POST 中获取所有信息,然后创建字符串供以后验证。遗憾的是,我不确定 \u2063
是否应该简单地存在于字符串中,或者它是否应该以某种 encoded/decoded 的方式存在。
- Apple Public Key - 应该如何使用。以某种 decoded/encoded 方式在文档中看到的版本。文档说解码 base 64,然后从中创建 X.509 标准 public 密钥。
有人有工作示例吗?此刻我完全迷失了。
我正在使用 NodeJS,它非常简单。我拿了 Apple 的 public 密钥并用 -----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 加密模块加载 public 密钥:
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
wrapper class from 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 没有任何经验:/
根据 documentation Apple 提供的信息,我无法通过 Skadnetwork/Apple 验证回发。
我有两个问题(至少我认为只有两个问题)。
\u2063
- 我正在使用 PHP 从 POST 中获取所有信息,然后创建字符串供以后验证。遗憾的是,我不确定\u2063
是否应该简单地存在于字符串中,或者它是否应该以某种 encoded/decoded 的方式存在。- Apple Public Key - 应该如何使用。以某种 decoded/encoded 方式在文档中看到的版本。文档说解码 base 64,然后从中创建 X.509 标准 public 密钥。
有人有工作示例吗?此刻我完全迷失了。
我正在使用 NodeJS,它非常简单。我拿了 Apple 的 public 密钥并用 -----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 加密模块加载 public 密钥:
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
wrapper class from 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 没有任何经验:/