Google Cloud Run 最终用户身份验证

Posted

技术标签:

【中文标题】Google Cloud Run 最终用户身份验证【英文标题】:Google Cloud Run end-user authentication 【发布时间】:2019-09-27 21:17:57 【问题描述】:

我将 Google Cloud Run 用于一个简单的 POC 网络应用。我希望暂时依靠 GCP IAM 来处理身份验证,类似于身份识别代理 (IAP) 可以与 App Engine 或 GKE 结合使用。

当我将 Cloud Run Invoker 角色授予用户时,我希望身份验证的工作方式类似于 IAP 的工作方式(登录重定向身份验证流程),但我却收到 403 错误。不过,我可以 curl 它设置 Authorization 标头。

是否需要在应用程序中为面向用户的 Web 应用程序实施身份验证?我希望依靠 IAM 做一个快速原型。如果需要,为简单原型实施 OAuth2 身份验证的推荐方法是什么? Firebase Authentication?

【问题讨论】:

这在此处记录:cloud.google.com/run/docs/securing/authenticating 您需要授权自己的 Google OAuth 令牌,然后添加到 HTTP 标头。 当前 Cloud Run 的授权设计不适合网站。考虑服务到服务授权 (API)。 确实,这就是我所发现的。我想我的问题确实是:Cloud Run 实际上是针对 Web 应用程序还是只是“后端”服务?后者似乎更多。我本来期望与 IAP 类似的行为,特别是因为角色管理具有非常相似的外观和感觉。 Cloud Run 适用于网站。 Web 应用程序需要澄清,因为 Cloud Run 具有 HTTP 运行时间限制(超时)。对于普通的 HTTP 请求/响应设计,我印象深刻。我认为授权功能可能已经急于进入测试版。我有一种感觉,谷歌会在生产状态到来之前在这方面投入更多的工作。提供反馈可能会帮助他们决定什么是关键。 【参考方案1】:

在这里运行 PM,

是的,现在您需要托管自己的 OAuth 客户端,例如:

<html>
  <head>
    <title>Google Sign-in + Run</title>
    <script src="https://apis.google.com/js/platform.js"></script>
    <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
    <meta name="google-signin-client_id" content="OAUTH_CLIENT_ID">
  </head>

  <body>
      <div class="g-signin2" data-onsuccess="onSignIn"></div></br>
    <div>
      <div id="returned-text"></div></br>
      <button id="test">Test</button>
    </div>
    <script>
    var id_token;

    function onSignIn(googleUser) 
      id_token = googleUser.getAuthResponse().id_token;
    

    $(document).ready(function() 
      $('#test').on('click', function () 
        var serviceURL = 'https://...';

        var xhr = new XMLHttpRequest();
        xhr.open('GET', functionURL);
        xhr.setRequestHeader('Authorization', 'bearer ' + id_token);
        xhr.onreadystatechange = function() 
            if (this.readyState == 4 && this.status == 200) 
               $('#returned-text').text(xhr.responseText);
            
        ;
        xhr.send();
      );
    );
    </script>
  </body>
</html>

请注意,CORS 在这里会很不稳定,我们建议托管在同一来源上以摆脱这种情况(例如,使用 Firebase Hosting integration)。

未来,我们可能会提供 IAP(为您托管 OAuth 客户端)。

【讨论】:

【参考方案2】:

受@mike 方法的启发,我在 Terraform 配置中创建了身份识别代理的 Cloud Run 托管版本。

https://futurice.com/blog/identity-aware-proxy-for-google-cloud-run

【讨论】:

【参考方案3】:

您可以使用启用 IAP 的外部负载均衡器实现最终用户身份验证:

使用“要求身份验证”选项设置创建 Cloud Run 服务 入口选项为“允许内部流量和来自 Cloud Load Balancing 的流量” 使用启用 IAP 的外部负载均衡器公开服务 为用户授予后端服务的“IAP-Secured Web App User”角色

您可以按照本教程获取工作示例hodo.dev/posts/post-30-gcp-cloudrun-iap/

【讨论】:

以上是关于Google Cloud Run 最终用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Tasks 无法向 Cloud Run 进行身份验证

如何从Java脚本安全地调用Google Cloud Run服务?

Google Cloud Endpoints 和用户身份验证

Google Cloud Endpoints 的自定义身份验证(而不是 OAuth2)

Cloud Scheduler 调用 Cloud Run 服务的身份验证

如何对 GCP Cloud Run 上的联合 GraphQL 服务进行身份验证?