使用服务帐户 python 验证对 Google Play Purchase API 的 GET 请求

问题描述 投票:0回答:2

我需要在 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
的情况下自动进行身份验证?

提前致谢

python android in-app-purchase google-api-python-client google-play-developer-api
2个回答
0
投票

按照此处的授权教程进行操作后:https://developers.google.com/android-publisher/authorization

我们将拥有

access_token
,我们需要像这样在授权标头中发送它:

headers = {
    'accept': 'application/json',
    'Authorization': f'Bearer {access_token}',
}
response = requests.get(url, headers=headers)

0
投票

先决条件和假设

看起来您已经设置了一个服务帐户,但在访问 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。我还建议您将上述代码整理成后续函数,以便在适当的地方调用。

祝你的其余项目好运!

© www.soinside.com 2019 - 2024. All rights reserved.