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)