- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从文档中尚不清楚您实际上做了什么来验证 jwsRepresentation来自服务器端 StoreKit 2 事务的字符串。
还有 Apple App Store Notifications V2 中的“signedPayload”似乎是相同的,但除了在设备上的客户端验证之外,也没有关于实际验证的文档。
什么给了?我们用这个 JWS/JWT 做什么?
最佳答案
(免责声明:我是加密货币新手,因此如果我在整个过程中使用了错误的术语等,请检查我)
jwsRepresentation
中的 JWS 和通知 V2 JSON 正文中的 signedPayload
都是 JWT — 您可以在 jwt.io 中查看它。 。这项工作是验证 JWT 签名,并在您充分确信它确实来自 Apple 后提取有效负载。然后,有效负载本身包含可用于升级用户帐户等的信息。服务器端一旦数据可信。
要验证 JWT,您需要找到 JWT header 的 "x5c"
集合中指定的用于签署 JWT 的签名,验证证书链,然后验证签名是否为确实来自苹果。
第一步:加载来自 Apple 的众所周知的根证书和中间证书。
import requests
from OpenSSL import crypto
ROOT_CER_URL = "https://www.apple.com/certificateauthority/AppleRootCA-G3.cer"
G6_CER_URL = "https://www.apple.com/certificateauthority/AppleWWDRCAG6.cer"
root_cert_bytes: bytes = requests.get(ROOT_CER_URL).content
root_cert = crypto.load_certificate(crypto.FILETYPE_ASN1, root_cert_bytes)
g6_cert_bytes: bytes = requests.get(G6_CER_URL).content
g6_cert = crypto.load_certificate(crypto.FILETYPE_ASN1, g6_cert_bytes)
第二步:从 JWT header 中获取证书链
import jwt # PyJWT library
# Get the signing keys out of the JWT header. The header will look like:
# {"alg": "ES256", "x5c": ["...base64 cert...", "...base64 cert..."]}
header = jwt.get_unverified_header(apple_jwt_string)
provided_certificates: List[crypto.X509] = []
for cert_base64 in header['x5c']:
cert_bytes = base64url_decode(cert_base64)
cert = crypto.load_certificate(crypto.FILETYPE_ASN1, cert_bytes)
provided_certificates.append(cert)
第三步:验证链是否如您所想 - 这可确保证书链由真正的 Apple 根证书和中间证书签名。
# First make sure these are the root & intermediate certs from Apple:
assert provided_certificates[-2].digest('sha256') == g6_cert.digest('sha256')
assert provided_certificates[-1].digest('sha256') == root_cert.digest('sha256')
# Now validate that the cert chain is cryptographically legit:
store = crypto.X509Store()
store.add_cert(root_cert)
store.add_cert(g6_cert)
for cert in provided_certificates[:-2]:
try:
crypto.X509StoreContext(store, cert).verify_certificate()
except crypto.X509StoreContextError:
logging.error("Invalid certificate chain in JWT: %s", apple_jwt)
return None
store.add_cert(cert)
最终:使用 header 中现在受信任的证书加载并验证 JWT。
# Now that the cert is validated, we can use it to verify the actual signature
# of the JWT. PyJWT does not understand this certificate if we pass it in, so
# we have to get the cryptography library's version of the same key:
cryptography_version_of_key = provided_certificates[0].get_pubkey().to_cryptography_key()
try:
return jwt.decode(apple_jwt, cryptography_version_of_key, algorithms=["ES256"])
except Exception:
logging.exception("Problem validating Apple JWT")
return None
瞧,您现在可以使用来自 App Store 的经过验证的 JWT 正文。
整个解决方案的要点:https://gist.github.com/taylorhughes/3968575b40dd97f851f35892931ebf3e
关于python - 在 python 中验证 StoreKit 2 事务 jwsRepresentation 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73000068/
我在收到 SKPaymentTransactionStatePurchased 后使用收据来验证购买通知,除其他外,获取用户刚刚购买的订阅的到期日期。 为了正确识别收据中刚刚发生的交易,我通过 tra
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在测试一个应用内购买,一周前工作正常,但现在似乎正在发挥作用。 我可以毫无问题地从商店加载产品(使用 NSLog 确认产品 ID、价格等...),但是当我发送购买产品的实际请求时 - 我不会遇到记
Apple 报告已修复错误,请参阅下面接受的答案... 更新时间:8 月 23 日星期一 10:00 GMT 尽管苹果的错误报告尚未关闭,但它现在似乎工作正常(至少对我们几个人来说)。可能他们已经解决
我正在使用恢复按钮实现应用内购买功能。 我设置了一个全新的测试用户,但没有支付任何费用。 当我点击恢复按钮并使用新的测试用户登录时,我无法捕获任何委托(delegate)方法来告诉我恢复事务已失败(因
我使用以下代码根据应用内购买编程指南请求产品列表。它曾经在我的 iPhone 应用程序中运行良好,但现在每次请求产品列表时都会崩溃。永远不会调用委托(delegate)方法 (void)product
这个问题已经有答案了: iPhone StoreKit - invalid product id's (22 个回答) 已关闭 3 年前。 我从 SKProductsRequest 获取了一个空的产品
我的 IAP 实时应用程序发生崩溃。我对此感到压力很大,因为这是一个错过的收入机会。谁能帮我理解这个崩溃报告? Crashed: com.apple.main-thread EXC_BAD_ACCES
为 SKStoreProductViewController 设置产品字典键时,Apple API Documentation提到了一个名为 SKStoreProductParameterProvid
我不完全明白这一点。例如,如果我尝试恢复用户 6 个月前购买的一年订阅: 原始购买日期是哪一天? 购买日期是哪一天? 如果此订阅在一年后自动续订,并且我们在 6 个月后再次恢复它:- 原始购买日期是哪
我即将第一次涉足应用内购买,但我不太确定如何处理我的情况。顶部是我的情况,底部是一些粗体的实际问题。任何建议将不胜感激。 我正在设计一款包含大量应用内购买内容的应用。每天都会产生大约 20 或 30
我的 IOS 应用程序有一个订阅产品;我想更改它以允许免费试用。我已经在 Itunes Connect 中编辑订阅以允许免费试用,但是当我尝试订阅该产品时,我收到关于购买 sub 的标准消息,而不是免
我的 iOS 应用程序中有一个应用程序内购买功能,允许用户升级到应用程序的完整版本。我已经创建了一个应该处理商店的类。问题是我在测试商店时收到无效的 ProductID 错误。我确定问题是无法从应用程
有没有办法知道用户何时使用 StoreKit 框架更改了商店? 这是为了如果我已经提取了产品列表并且用户更改了商店,那么我可以刷新新商店区域设置的价格。 最佳答案 我找到了一个解决方案,有点“技巧”,
我的实时应用程序存在问题,未完成的购买被错误处理。我正在尝试测试我的新代码以确保这会得到解决,所以我下载了实时应用程序,导致了问题,然后加载了我的开发应用程序(或 Ad-Hoc 应用程序),希望 St
我正在尝试将应用内购买集成到我的 iOS 应用中。 我已经在 itunes.connect 上成功配置了项目 我已经关注了这个tutorial雷温德利希的 我已成功在我的设备中获得免费的应用内订阅项目
我正在开发一个 iPhone 应用程序,该应用程序将使用应用程序内购买来让客户购买产品。根据 StoreKit 文档,我需要使用我的产品标识符向 App Store 发送请求以获取有关它们的信息。 我
我很快就要实现 StoreKit 功能,我想知道......有没有办法同时向用户免费提供一次产品,例如作为首次使用该应用程序的礼物? 在我的特殊情况下,我将在我的教育应用程序中提供几种产品,如果用户有
有谁知道我在哪里可以找到所有 StoreKit 错误代码和描述的列表。它在 WWDC 2014 的第 303 节(优化应用内购买)中有所暗示,但此人从未提供 URL,我终究找不到正确的文档。 我找到了
我已经让 StoreKit 用于自动续订订阅,并且可以通过 Sandbox 成功购买和续订订阅。到目前为止,还不错。 我遇到的问题是 apple 返回的到期日期似乎不正确。 首次购买订阅时,它会给您一
我是一名优秀的程序员,十分优秀!