身份验证凭据丢失或无效的应用商店连接 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:由于身份验证凭据无效或缺少授权标头,身份验证失败
Symfony 5 / 使用 API 编写自定义身份验证总是返回我无效的凭据
请求具有无效的身份验证凭据。云语音 api 中的预期 OAuth 2 访问令牌错误
请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据 automl