我们推出了一个iOS应用程序,我想从AppStore Connect API获取一些信息(例如安装、更新、评论)。在
我创建了一个JSON Web令牌,如苹果官方文档所述:Link
之后,我用头中的令牌发出请求。现在我每次都会得到一个“401”|“NOT_AUTHORIZED”作为答案,见下图: REST Response
在下面的代码片段中,您可以看到我的python代码(我试图用python和R来解决它,但结果总是一样的)。在
首先,我创建了一个JWT:
from datetime import datetime, timedelta from jose import jwt, jws import ecdsa KEY_ID = "XXXXXXXXXX" ISSUER_ID = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" PRIVATE_KEY = open('AuthKey_XXXXXXXXXX.p8', 'r').read() TIMESTAMP = int( (datetime.now() - timedelta(minutes = 45)).timestamp() * 1000) claim = {"iss" : ISSUER_ID, "exp" : TIMESTAMP, "aud" : "appstoreconnect-v1"} header = { "alg": "ES256", "kid": KEY_ID, "typ": "JWT" } # Create the JWT encoded = jwt.encode(claim, PRIVATE_KEY, algorithm='ES256', headers=header)
现在,当我打印编码的时,我得到以下JWT(看起来对我有效):
^{pr2}$即使我通过Base64对JWT的前两部分进行解码,也会得到正确的头(它还包含正确的编码算法:“alg”:“ES256”)和声明:
from jose.utils import base64url_decode print(base64url_decode(b'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlhYWFhYWFhYWFgifQ')) print(base64url_decode(b'eyJpc3MiOiJYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFgiLCJleHAiOjE1NDUzOTc1MTQ1ODAsImF1ZCI6ImFwcHN0b3JlY29ubmVjdC12MSJ9'))
如下图所示:Output Base64 Decoding
现在,我认为JWT对象已经准备好了,我向API发送请求:
import requests JWT = 'Bearer ' + encoded URL = 'https://api.appstoreconnect.apple.com/v1/apps' HEAD = {'Authorization': JWT} print(HEAD) R = requests.get(URL, headers=HEAD) R.json()
现在我们可以看到我的问题了,看看图片:Header | REST Response
请注意,对于这个例子,我已经隐藏了密钥\u ID,颁发者密钥和私有密钥。在
首先,请不要在没有上下文管理器的情况下打开文件。此字符串:
应该是:
^{pr2}$它使您避免了许多未关闭文件的问题。在
然后,检查您从文件中读取的令牌。对吗?在
我看到的下一个问题是时间戳。”令牌的过期时间,以Unix epoch时间为单位;“我猜您是以毫秒为单位提供的。在
您的令牌包含过期时间
等于50941年9月12日。在
当我删除最后三个数字时
2018年12月21日 这就更有道理了。在
改变那条线
到
^{pr2}$exp是从1970年1月1日00:00起定义为秒的时间戳 另请参见here
相关问题 更多 >
编程相关推荐