我尝试使用以下代码在 Python Jupyter Notebook 中发出 Apple App Store Connect API 请求并收到错误:
错误:401,未授权,身份验证凭据丢失或无效。
#make API request
url = "https://api.appstoreconnect.apple.com/v1/salesReports"
params = {
'filter[frequency]': 'DAILY',
'filter[reportType]': 'SALES',
'filter[reportSubType]': 'SUMMARY',
'filter[vendorNumber]': 'XXXXXXXX'
}
headers = {
'Authorization': f"Bearer {token}",
'Content-type': 'application/json'
}
response = requests.get(url, headers=headers)
#apps = response.json()
print(response.text)
我按照苹果为 App Store Connect API 创建 API 密钥 https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api 提供的步骤创建了不记名令牌,并为 api 请求生成令牌https://developer .apple.com/documentation/appstoreconnectapi/generate_tokens_for_api_requests 我使用以下代码创建了以下常量和 JWT 令牌,并编写了代码来查看生成的令牌是否仍然有效:
#Constants
Issuer_ID = "XXXXXXXXx"
Key_ID = "XXXXXXX"
Secret_key = "/Users/home/Desktop/Apple_API_Key"
Audience = "appstoreconnect-v1"
token_duration = 1200 #cannot exceed this max amount of else apple will reject request
#创建 jwt 令牌
with open(Secret_key, 'r') as f:
Secret_key = f.read()
header = {
'alg':'ES256',
'kid':Key_ID,
'typ':'JWT'
}
payload = {
'iss':Issuer_ID,
'exp': time.time() + token_duration,
'aud': Audience
}
token = jwt.encode(payload, Secret_key, algorithm = 'ES256', headers = header)
print(token)
decoded_token = jwt.decode(token, options={"verify_signature": False})
expiration_timestamp = decoded_token['exp']
if time.time() > expiration_timestamp:
print("The token is expired!")
else:
print("The token is still valid.")
我遇到了类似的问题。要解决此问题,请确保您在私钥创建过程中授予Admin访问权限。此外,您可以尝试从请求标头中删除
Content-type
。我在苹果论坛上看到它对某些用户有帮助。
以防万一有人不关心所使用的语言:
当使用 PHP 也适合你时,这个就很好用。
https://github.com/ikool-cn/appstoreconnectapi-php-jwt-sign
它需要一个名为
ECSign.php
的文件。您可以从 Github 上的同一作者那里获取:https://github.com/ikool-cn/appstoreconnectapi-php-jwt-sign/blob/master/ECSign.php
只需插入您的私钥、密钥 ID 和颁发者 ID,将
ECSign.php
文件放在同一目录中即可。