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 最终用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章