通过 API Key 访问 Google Cloud Function
Posted
技术标签:
【中文标题】通过 API Key 访问 Google Cloud Function【英文标题】:Accessing Google Cloud Function via API Key 【发布时间】:2021-04-08 23:24:02 【问题描述】:我从我的 ML 模型创建了一个 Google Cloud 函数。它适用于功能的 GCP 网站上的谷歌“测试”:
测试截图
我有 2 次托管该功能,一次通过身份验证 (Google IAM),第二次未经身份验证
认证修改
如果我现在想调用函数,例如在邮递员中,没有身份验证的版本可以正常工作。 但是对于身份验证的事情,弄清楚如何实现这一点就变得一发不可收拾。
如何使用受限的 API 密钥实现对云功能的访问?`
【问题讨论】:
简短的回答是您不能将 API 密钥与 Cloud Functions 一起使用。 Cloud Functions 使用 Google OAuth 2 身份令牌。使用有关需要访问 Cloud Functions 的详细信息来编辑您的问题。对于大多数 Google 服务,这是内置的(默认服务帐户)。 要试验 Postman,请使用 CLI 生成身份令牌。这进入Authorization: Bearer <TOKEN>
标头。 cloud.google.com/sdk/gcloud/reference/auth/print-identity-token
友情提示,请同时保护您的云函数(截图)的 url,因为它包含有关您的项目 id、区域和云函数名称的信息。 xD
【参考方案1】:
您不能使用 API 密钥直接调用您的函数。您需要实现一个代理层来检查您的 API 密钥并使用 OAuth2 授予的身份令牌执行请求。为此,您可以使用Cloud Endpoint 或其全新的无服务器实现API Gateway。我wrote an article on Cloud Endpoint,您可以在 API Gateway 上重复使用它。
如果仅用于 Postman 和您的测试,您可以使用 GCLOUD CLI 生成令牌
gcloud auth print-identity-token
复制结果并将其添加到请求的标头中
Authorization: Bearer <token>
1H 有效。执行您的测试,当它过期时,生成一个新的并继续。
我也是wrote a small tool for this。使用 Postman 执行预调用以获取令牌,然后如前所述在您的请求中使用它
【讨论】:
【参考方案2】:要使用 postman 对云函数进行身份验证调用,您需要 jwt_token。
-
首先创建服务帐号
授予 Cloud 函数调用者对此 SA 的访问权限
生成 JWT
import time
import google.auth.crypt
import google.auth.jwt
sa_keyfile = 'path_of_service_account'
iss = 'email_address_of_service_account'
aud = 'function_url'
iat = int(time.time())
exp = iat + 3600
def generate_jwt():
"""Generates a signed JSON Web Token using a Google API Service Account."""
payload = "iat": iat, "exp": exp, "iss": iss, "aud": aud, "sub": iss, "email": iss
signer = google.auth.crypt.RSASigner.from_service_account_file(sa_keyfile)
jwt = google.auth.jwt.encode(signer, payload)
return jwt
if __name__ == '__main__':
signed_jwt = generate_jwt()
print(signed_jwt.decode()+'\n')
【讨论】:
【参考方案3】:最近 Google 在 beta 中添加了一个新的 Api Gateway,它将隐藏您的 google 函数声明并使用 API KEY 提供 HTTP 身份验证
https://cloud.google.com/api-gateway/docs/quickstart-console#securing_access_by_using_an_api_key
这样做,您可以使用 API Key 在客户端和网关之间创建身份验证以及网关和 google 功能之间的身份验证,可以使用普通服务帐户完成
【讨论】:
以上是关于通过 API Key 访问 Google Cloud Function的主要内容,如果未能解决你的问题,请参考以下文章
无法访问通过 Google 电子表格 API 通过服务帐户创建的工作表
使用 Google 登录通过 Firebase 签名后如何访问课堂 API
Google BigQuery 通过 API 访问公共数据集