使用jwt.encode(payload=payload, key=sp_client_secret, algorithm='ES256', headers=headers)
,报错:ValueError: (‘Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).’, [<OpenSSLError(code=503841036, lib=60, reason=524556, reason_text=unsupported)>]),百度了半天,感谢原文链接:https://blog.csdn.net/qq_39360343/article/details/88884925
最近苹果账号不知道咋的弄出来一个账号密码登陆后需要手机验证码双重认证登陆,很麻烦于是想通过App Store Connect API直连导出财务日志之类的东西。
苹果提供了一套JWT的验证连接方式,关于JWT网上介绍很多在此对细节略过不表。
而完成登陆简单点讲就是需要在发送向指定http地址的get请求头中添加JWT。具体生成JWT的过程如下(前两步)。
1. 生成API key
https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api
登陆itunes connect后按指示点选即可,最后设置好密钥权限后点击下载唯一的私钥文件,文件名默认为"AuthKey_XXXXXXXXXX.p8",其中<xx…x>部分为该密钥ID
2.生成json Web Token
https://developer.apple.com/documentation/appstoreconnectapi/generating_tokens_for_api_requests
JWT包含三部分,最终格式为
下面直接上代码
import time, jwt
# 1. Create the JWT header
header = {
"alg": "ES256",
"kid": "XXXXXXXXXX", # your own key ID
"typ": "JWT"
}
# 2.1 Create the JWT payload
payload = {
"iss": "XXX-XXX-XXX-XXX-XXX",
# 在Store Connect上可以点击复制 iss ID
"exp": int(time.time()) + 60*10,
# token最长有效时间20min,这里设置为10min
"aud": "appstoreconnect-v1"
}
# 2.2 privateKey 直接打开导入
privatekey = open('D:/AuthKey_S93MFC6GNN.p8', 'r').read()
# 3. Sign the JWT
nc = jwt.encode(payload=payload, key=privatekey, algorithm='ES256', headers=header)
这里需要注意,苹果采用的ES256编码方式,key是需要分段(\n)的,密钥头尾的"—BEGIN PRIVATE KEY—"也是必须的。之前我一直直接复制privatekey以文本的形式输入,在HS256下正常但是ES256会报错ValueError: Could not deserialize key data。还以为是什么PEM、SSH之类编解码方式的问题折腾了半天,最后受到这篇文章(感谢 http://www.mamicode.com/info-detail-1470498.html )的提醒才想到也许仅仅是格式问题。因此直接使用open的形式打开.p8密钥文件,就没有问题了。