【问题标题】:How to securely call a Google Cloud Run service from Java Script?如何从 Javascript 安全地调用 Google Cloud Run 服务?
【发布时间】:2020-05-18 08:41:12
【问题描述】:

我们计划为我们的项目构建一个 Web 客户端 (Angular)。我们的后端将是很多谷歌云运行服务。我们如何确保这些服务只能被这个 Web 应用程序调用? 我知道有服务帐户,我可以使用它来限制对 Cloud Run 服务的访问,但是我如何在纯 JavaScript 应用程序中并且没有登录用户的情况下做到这一点。我只想验证应用程序而不是用户。 有什么建议或样品吗?

【问题讨论】:

  • 当你说“Javascript”时,你的意思是一个网站?还是 Node 中的后端?您事先了解用户吗?如果有,他们有 Google 帐户吗?
  • 是的,我的意思是一个网站,是的,我认识用户,但问题是我是否可以在用户登录之前限制对运行服务的访问。所以只允许这个 web 客户端访问服务。在我进行身份验证之前是否有“应用程序授权”之类的东西。为了使这更简单,我可以以某种方式将服务帐户分配给网站,并且该服务帐户在我的服务上具有“服务调用者”角色。所以只有拥有这个服务的网站是账号才能调用我的运行服务。

标签: javascript authentication google-cloud-platform google-cloud-run


【解决方案1】:

TL;DR:应用程序身份验证和授权级别由服务帐户管理。但是将服务帐户密钥文件放在您的 Javascript 应用程序中(因此任何用户都可以在他们的浏览器中查看)是没有用的,因为您的秘密会公开!


使用 Cloud Run,您有 2 种模式:私有和公共

如果是公开的,没有安全性,所有请求都会转到您的 Cloud Run 服务

如果是私有的,Google 前端会检查请求者的身份以及他们是否拥有 run.invoker 权限。如果是,则请求通过,否则将被阻止。

今天,为了进行身份验证,您需要一个服务帐户。如果您不在 Google Cloud Platform 上(例如,在用户的浏览器中),您需要一个服务帐户密钥文件。但是,如果你把它放在你的网站上,它就不安全了,因为任何人都可以拿走它并在你的网站之外使用它。

所以,今天,您不能这样做:您的 Cloud Run 要么是公开的,没有任何检查,要么是私有的,具有身份验证(和 IAM 授权)

但是,我希望很快,至少在 2020 年,您应该能够在 Cloud Run 前面放置一个负载均衡器并在其上激活 IAP。因此,用户将通过他们的 Google 帐户身份验证 cookie (SSO) 进行身份验证。但是,在浏览器的私密模式下,用户在访问网站之前会被要求进行身份验证。不是免认证,只是认证不是自己管理的。

【讨论】:

  • 感谢您的澄清。实际上,将 Cloud Run 服务放在可以配置允许的 IP 范围的防火墙后面的可能性对我们来说已经足够了。案子。仍然期待 IAP 解决方案。问题仍然存在。我仍然可以通过将用户角色分配为调用者来保护我的服务,对吗?所以我的网站是公开的,但是如果用户使用分配给某个服务作为调用者的帐户登录,则用户只能调用运行服务。还是这也不可能?
  • 今天公开测试版中没有任何内容。
  • 好的。所以我有后续问题。是否可以使用 NGINX 运行 Compute Engine 来托管我们的 Webclient,它使用服务帐户文件进行身份验证,但将该 Compute Engine 放在防火墙后面,以便只有我们的员工可以访问它?这是一个选择还是一个非常愚蠢的想法?
  • 借助计算引擎和网络工具,您可以完成您在“旧世界”传统数据中心所做的一切。因此,是的,你可以。但是,请注意:您的服务不是弹性的、可扩展的、区域性的 HA。您必须安装自己的 SSL 证书并执行比托管服务更多的东西。也许,更好的解决方案(但也更昂贵)是部署一个带有 Cloud Run 插件的 GKE 集群,以获得完全相同的 Cloud Run 体验。 (Cloud Run on Anthos -> 营销名称)然后,轻松切换回托管 Cloud Run,功能已发布。
  • 听起来不错!谢谢!
猜你喜欢
  • 2019-09-05
  • 2020-09-24
  • 2020-07-14
  • 2019-10-24
  • 2020-05-31
  • 2020-08-19
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多