【发布时间】:2021-01-18 21:25:02
【问题描述】:
我有一个 Java 中的谷歌云功能。 客户端将使用 HTTP 触发 URL 调用该函数。
但这并不安全。我看过一些文档说你应该传递一个令牌或客户端 ID,然后在服务器端验证它。
谁能详细解释一下,如果有请提供代码示例。
我的疑问是在客户端使用 Http 触发器调用函数时对其进行身份验证
【问题讨论】:
我有一个 Java 中的谷歌云功能。 客户端将使用 HTTP 触发 URL 调用该函数。
但这并不安全。我看过一些文档说你应该传递一个令牌或客户端 ID,然后在服务器端验证它。
谁能详细解释一下,如果有请提供代码示例。
我的疑问是在客户端使用 Http 触发器调用函数时对其进行身份验证
【问题讨论】:
您可以使用外部 OAuth 服务器,如 keycloack (https://github.com/keycloak/keycloak),或使用 Json Web Tokens -- https://jwt.io/ -- 适用于各种语言,适用于微服务。
【讨论】:
page 很好地解释了您必须在 Cloud Functions 上对请求者进行身份验证的所有能力。
如果您有用户,最好的方法是使用Firebase Auth(我们的Google Cloud Identity Platform,它只是比Firebase Auth with more features 更先进的解决方案)
但是,您需要向所有用户授予 cloudfunction.invoker 角色,以允许他们调用 Cloud Functions。这可能很困难。您也可以在您身边执行检查,但在这种情况下,您删除了 google 的安全(过滤器)层,您必须自己检查所有流量(在计费和受到攻击的情况下,这并不安全)。
不建议使用最新的解决方案 API 密钥,尤其是对用户而言。但对于机器对机器来说,有时它是唯一的解决方案。但是,没有开箱即用的解决方案,为此我写了an article,它解释了如何创建一个Cloud Endpoint(或现在的Cloud API Gateway,这是带有ESPv2的Cloud Endpoint的无服务器解决方案)来接受API键。
使用此最新解决方案,如果您更改 security definition,您还可以接受来自 Firebase Auth(或 Cloud Identity Platform)的 OAuth2 令牌,但是这一次,您不需要授予您云端的所有用户函数 IAM 角色。令牌只需有效,它是用于执行调用的 Cloud Endpoint 服务帐户(因此需要在 Cloud Functions 上进行授权)。
此外,由于您可以接受 OAuth2 令牌,因此您也可以接受非 Google 令牌,从而使您的用户处于任何符合 OAuth2 的 IDP(KeyCloak、Okta、...)
【讨论】: