通过 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的主要内容,如果未能解决你的问题,请参考以下文章

通过 API 访问 Google 照片的长期令牌?

无法访问通过 Google 电子表格 API 通过服务帐户创建的工作表

使用 Google 登录通过 Firebase 签名后如何访问课堂 API

Google BigQuery 通过 API 访问公共数据集

通过 Python 访问 Google Shopping API

允许通过 API v3 访问 Google 服务帐户 YouTube 上传访问权限