REST请求应用商店连接API响应为“401”|“未授权”

2024-10-16 17:21:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我们推出了一个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颁发者密钥私有密钥。在


Tags: keyfromimportrestapiiddatetime密钥
2条回答

首先,请不要在没有上下文管理器的情况下打开文件。此字符串:

PRIVATE_KEY = open('AuthKey_XXXXXXXXXX.p8', 'r').read()

应该是:

^{pr2}$

它使您避免了许多未关闭文件的问题。在

然后,检查您从文件中读取的令牌。对吗?在

我看到的下一个问题是时间戳。”令牌的过期时间,以Unix epoch时间为单位;“我猜您是以毫秒为单位提供的。在

您的令牌包含过期时间

"exp": 1545397514580,

等于50941年9月12日。在

当我删除最后三个数字时

"exp": 1545397514,

2018年12月21日 这就更有道理了。在

改变那条线

TIMESTAMP = int( (datetime.now() - timedelta(minutes = 45)).timestamp() * 1000)

^{pr2}$

exp是从1970年1月1日00:00起定义为秒的时间戳 另请参见here

相关问题 更多 >