我需要在 python 中从我的 AWS lambda 验证我的 android 应用程序的购买。
我看过很多关于如何这样做的帖子和文档,这是我写的代码:
url = f"{google_verify_purchase_endpoint}/{product_id}/tokens/{token}"
response = requests.get(url=url)
data = response.json()
logging.info(f"Response from Google Play API : {data}")
当我这样做时,它会抛出 401 状态代码不允许。 好的,我已经创建了一个服务帐户来允许使用 OAuth 的请求,但是我如何使用它来允许请求?
不幸的是,我不能使用
here提到的
google-api-python-client
,这对于我的 AWS lambda 最大尺寸 250Mb 解压缩包来说太大了。
所以我的问题是通过简单的 GET 请求使用服务帐户,或者如何在没有
google-api-python-client
的情况下自动进行身份验证?
提前致谢
按照此处的授权教程进行操作后:https://developers.google.com/android-publisher/authorization
我们将拥有
access_token
,我们需要像这样在授权标头中发送它:
headers = {
'accept': 'application/json',
'Authorization': f'Bearer {access_token}',
}
response = requests.get(url, headers=headers)
看起来您已经设置了一个服务帐户,但在访问 verify_purchase 端点之前需要帮助获取 JSON Web 令牌 (JWT)。 here 记录了生成 JWT。您应该阅读本文以了解以下代码的作用。
我注意到您有存储限制,但您几乎肯定需要一个额外的库来处理令牌生成的加密方面。 PyJwt 相当小(包括它的要求)。
让我们先安装这个:
pip3 install PyJwt
接下来,让我们从谷歌云中获取我们的服务帐户私钥。
Open your project in Google Cloud.
Go to "APIs & Services".
Go to "Credentials".
Click "Service Account".
Find your Service Account and Select "Manage Keys".
Select "Create new key" from the "ADD KEY" drop down.
Select JSON.
Save this JSON file to a secure location accessible by your script.
现在我们可以开始使用 Python 脚本了。这是一个 example 让你开始(你应该在投入生产之前审查它):
import time
import json
import requests
import jwt
claim_start = int(time.time())
# Generate a claim header, this will always be the same.
header = {"alg":"RS256","typ":"JWT"}
# This is a claim for 1hr access to the android publisher API.
# Replace <<EMAIL ADDRESS OF YOUR SERVICE ACCOUNT>> as appropriate.
claims = {
"iss": "<<EMAIL ADDRESS OF YOUR SERVICE ACCOUNT>>",
"scope": "https://www.googleapis.com/auth/androidpublisher",
"aud": "https://oauth2.googleapis.com/token",
"exp": claim_start + 3600,
"iat": claim_start
}
with open("<<PATH TO JSON FILE>>", 'r') as f:
json_key = json.load(f)
key = json_key.get('private_key')
# Generate a signed jwt
token = jwt.encode(claims, key, headers=header, algorithm="RS256")
# Mandatory parameters required by GCloud.
params = {
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": token
}
r = requests.post("https://www.googleapis.com/oauth2/v4/token", data=params)
r.raise_for_status()
access_token = r.json()['access_token']
access_token
然后可以用作您项目的 JWT 承载。请注意,我已将 token
变量从您的原始帖子更改为 subscription_token
以明确它与此身份验证机制无关。 (它指的是“购买订阅时提供给用户设备的令牌。”根据您提供的文档。)
headers = {
"Host": "www.googleapis.com",
"Authorization": "Bearer " + access_token,
"Content-Type": "application/json"
}
google_verify_purchase_endpoint=""
product_id=""
subscription_token=""
url = f"{google_verify_purchase_endpoint}/{product_id}/tokens/{subscription_token}"
response = requests.get(url=url, headers=headers)
data = response.json()
logging.info(f"Response from Google Play API : {data}")
这只是为了介绍在没有 SDK 的情况下针对 Google Cloud API 进行身份验证。最终,您要对项目的安全负责,阅读本文的任何其他人都应该尽可能使用 SDK。我还建议您将上述代码整理成后续函数,以便在适当的地方调用。
祝你的其余项目好运!