身份验证凭据丢失或无效的应用商店连接 api python

Posted

技术标签:

【中文标题】身份验证凭据丢失或无效的应用商店连接 api python【英文标题】:Authentication credentials are missing or invalid app store connect api python 【发布时间】:2022-01-16 16:42:40 【问题描述】:

我在这里尝试使用来自 App Store Connect API 的销售报告 API 和 Python 脚本。

import jwt
import requests
import time
import json

KEY_ID = "XXXXXXXXX"
ISSUER_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# EXPIRATION_TIME = int(round(time.time() + (20.0 * 60.0))) # 20 minutes timestamp
PATH_TO_KEY = '/Users/164187.victor/Documents/Credentials/App_Store_Connect_RR/AuthKey_XXXXXXXXX.p8'
# pseudo, removed secret info
# read the file, currently binary but have tried string too
with open(PATH_TO_KEY, 'r+b') as keyfile:
    secret = keyfile.read()
expir = round(time.time() + 20 * 60)
# sign the token with the iss, time, key, and kid with the correct alg
token = jwt.encode('iss': ISSUER_ID, 
                    'exp': expir, 
                    'aud': 'appstoreconnect-v1',
                    secret, algorithm='ES256', 
                    headers='alg': 'ES256', 'kid': KEY_ID, 'typ': 'JWT')

# decode the bytes and create the get request header
headers = 'Authorization': f'Bearer token'

params = 'filter[reportSubType]': 'SUMMARY', 'filter[reportType]': 'SALES', 'filter[frequency]':'DAILY', 'filter[vendorNumber]': 'XXXXXXXX'
# send the get request
r = requests.get('https://api.appstoreconnect.apple.com/v1/salesReports',
                 headers=headers, params=params)

# Write the response in a pretty printed JSON file
with open('output.json', 'w') as out:
    out.write(json.dumps(r.json(), indent=4))

我在我的 json 输出文件中得到了这个结果:


    "errors": [
        
            "status": "401",
            "code": "NOT_AUTHORIZED",
            "title": "Authentication credentials are missing or invalid.",
            "detail": "Provide a properly configured and signed bearer token, and make sure that it has not expired. Learn more about Generating Tokens for API Requests https://developer.apple.com/go/?id=api-generating-tokens"
        
    ]

我尝试过的:

    在 jwt.io 中检查我的令牌,它在那里工作正常。 对关键权限使用管理员访问级别 试图删除标题中的“alg”属性导致一些帖子说它会解决问题,但它对我不起作用

有什么办法可以解决这个问题吗?我已经坚持了 1 周,请帮助

【问题讨论】:

为什么接收你的令牌的 API 应该信任你自己生成的 JWT 令牌? 这方面有什么更新吗?你能解决吗 【参考方案1】:

鉴于您的错误链接https://developer.apple.com/go/?id=api-generating-tokens,您缺少有效负载中的 iat(Issued at Time)和范围参数。

【讨论】:

【参考方案2】:

您的代码似乎源自this Gist,它使用authlib 创建JWT 令牌。但是你代码中的import jwt声明表明你已经切换到PyJWT,不要混淆两个包,它们有不同的使用方式。

对于PyJWT

import jwt

token_data = jwt.encode(
    
        'iss': ISSUER_ID,
        'aud': 'appstoreconnect-v1',
        'exp': expiry
    ,
    secret,
    headers=
        'kid': KEY_ID
    ,
    algorithm='ES256'
)

print(token_data.decode('UTF-8'))

对于authlib

from authlib.jose import jwt

token_data = jwt.encode(
    
        "alg": "ES256",
        "kid": KEY_ID,
        "typ": "JWT"
    ,
    
        "iss": ISSUER_ID,
        "exp": expir,
        "aud": "appstoreconnect-v1"
    ,
    secret
)

print(token.decode())

对于这两种方式,不要忘记在请求标头中使用之前调用decode()

另一个更好的选择是使用applaud——一个用于访问 App Store Connect API 的 Python 客户端库,您只需传递凭据来初始化一个 Connection 对象,applaud 会为您完成剩下的工作:

# Create the Connection
connection = Connection(ISSUER_ID, KEY_ID, PRIVATE_KEY)

r = connection.sales_reports().filter(
    report_sub_type=SalesReportsEndpoint.ReportSubType.SUMMARY, # or "SUMMARY"
    report_type=SalesReportsEndpoint.ReportType.SALES, # or "SALES"
    frequency=SalesReportsEndpoint.Frequency.MONTHLY, # or "MONTHLY"
    report_date='2021-12',
    vendor_number='12345678',
).get()

r.save('output.txt', decompress=True)

您可以在Payments and Financial Reports 中找到您的供应商编号。示例代码is here。

完全披露,我是applaud的原作者。

【讨论】:

以上是关于身份验证凭据丢失或无效的应用商店连接 api python的主要内容,如果未能解决你的问题,请参考以下文章

PayPal PHP SDK:由于身份验证凭据无效或缺少授权标头,身份验证失败

Shopware REST Api - 身份验证无效或缺失

使用node-soap连接Bing Ads API

Symfony 5 / 使用 API 编写自定义身份验证总是返回我无效的凭据

请求具有无效的身份验证凭据。云语音 api 中的预期 OAuth 2 访问令牌错误

请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据 automl